力扣每日一题:统计和小于目标的下标对数目
开篇
今天这道力扣打卡题写得我好狼狈,一开始思路有点问题,后面就是对自己的代码到处缝缝补补,最后蒙混过关。只能分享一下大佬的代码,然后我帮大家分享代码的思路。
题目链接: 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;}
}
结语
如果对这道题的分享对您有帮助,可以点个关注,我会每天更新力扣题目的讲解,与大伙儿一起向前迈进!