? ? 力扣每日一題:統計和小于目標的下標對數目
開篇
?今天這道力扣打卡題寫得我好狼狽,一開始思路有點問題,后面就是對自己的代碼到處縫縫補補,最后蒙混過關。只能分享一下大佬的代碼,然后我幫大家分享代碼的思路。
題目鏈接: 2824.統計和小于目標的下標對數目
題目描述
代碼思路
?這道題自己寫的時候思路比較混亂,于是找了位大佬的代碼,自己修改完善了一下,然后來分析。
1.根據題目的要求,我們可以發現,如果對nums集合進行排序,并不會影響結果,所以果斷使用sort排序
Collections.sort(nums);
我以前只用過數組的sort排序,集合的排序我是第一次使用,真香
2.然后因為是兩個值的運算,可以使用雙指針法,一個從左到右,一個從右到左。利用左指針進行for循環,然后用while循環進行判斷當相加大于目標值時,右指針左移,直至停止移動,此時兩個指針的距離就是符合條件的數目。然后左指針右移,進行下一個循環。
代碼純享版
class Solution {public int countPairs(List<Integer> nums, int target) {if(nums.size() <= 1) return 0;Collections.sort(nums);int sum = 0;for (int i = 0, j = nums.size() - 1; i < j; i++) {while (i < j && nums.get(i) + nums.get(j) >= target) {j--;}sum += j - i;}return sum;}
}
代碼逐行解析版
class Solution {public int countPairs(List<Integer> nums, int target) {if(nums.size() <= 1) return 0; //集合長度小于1,數目位0Collections.sort(nums); //對集合進行sort排序int sum = 0; //統計數目for (int i = 0, j = nums.size() - 1; i < j; i++) { //初始時左指針i=0,右指針j=nums.size() - 1while (i < j && nums.get(i) + nums.get(j) >= target) { //讓右指針左移到滿足要求的位置j--;}sum += j - i; //兩個指針的距離就是這次循環中滿足條件的個數,然后i++讓左指針右移,進入下一次循環}return sum;//返回統計數目}
}
我的代碼
我的思路也是雙指針,但由于沒有和上面的解法一樣排除掉一些一定不成立的過程,而且思路比較混亂,所以就不作為主要思路來分析了。
class Solution {public int countPairs(List<Integer> nums, int target) {if(nums.size() <= 1) return 0;Collections.sort(nums);int left = 0, right = 1;int sum = 0;while(left < nums.size() - 1){if(nums.get(left) + nums.get(right) >= target){ //不符合要求時left++; right = left + 1;if(right > nums.size() - 1) break;}else if(nums.get(left) + nums.get(right) < target ){ //符合要求時sum++;if(right < nums.size() - 1) right++; //根據right所在的不同情況就行移動else {left++;right = left + 1;}}}return sum;}
}
結語
?如果對這道題的分享對您有幫助,可以點個關注,我會每天更新力扣題目的講解,與大伙兒一起向前邁進!