力扣每日一题:统计和小于目标的下标对数目
开篇
今天这道力扣打卡题写得我好狼狈,一开始思路有点问题,后面就是对自己的代码到处缝缝补补,最后蒙混过关。只能分享一下大佬的代码,然后我帮大家分享代码的思路。
题目链接: 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,数目位0
Collections.sort(nums); //对集合进行sort排序
int sum = 0; //统计数目
for (int i = 0, j = nums.size() - 1; i < j; i++) { //初始时左指针i=0,右指针j=nums.size() - 1
while (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;
}
}
结语
如果对这道题的分享对您有帮助,可以点个关注,我会每天更新力扣题目的讲解,与大伙儿一起向前迈进!