四数之和|统计和小于目标的下标对数目

四数之和

点击查看代码
class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        int n = nums.length;
        Arrays.sort(nums);
        List<List<Integer>> res = new ArrayList<>();

        for(int i = 0; i < n - 3 ; i++){
            if( (long)nums[i]+nums[i+1]+nums[i+2]+nums[i+3] > target){
                break;
            }
            if((long)nums[i]+nums[n-3]+nums[n-2]+nums[n-1] < target){
                continue;
            }
            int x = nums[i];
            if(i != 0 && nums[i] == nums[i-1]){
                    continue;
            }
            int secondTarget = target - x ;
            for(int j = i+1; j < n-2;j++){
                if((long)nums[i]+nums[j]+nums[j+1]+nums[j+2] > target){
                    break;
                }
                if(nums[i]+nums[j]+nums[n-2]+nums[n-1] < target){
                    continue;
                }
                int y = nums[j];
                if(j != i+1 && nums[j] == nums[j-1]){
                    continue;
                }
                int l = j + 1;
                int r = n - 1;
                while(l < r){
                    long sum = (long)y + nums[l] + nums[r];
                    if(sum == secondTarget){
                        res.add(Arrays.asList(nums[l],nums[r],y,x));
                        l++;
                        while(l < r && nums[l]==nums[l-1]){
                            l++;
                        }
                        r--;
                        while(l < r && nums[r] == nums[r+1]){
                            r--;
                        }    
                    }
                    else if(sum < secondTarget){
                        l++;
                    }
                    else{
                        r--;
                    }
                }
            }
        }
        return res;
    }
}

统计和小于目标的下标对数目

点击查看代码
class Solution {
    public int countPairs(List<Integer> nums, int target) {
        Collections.sort(nums);
        int res = 0;
        int l = 0;
        int r = nums.size() - 1;
        
        while (l < r) {
            int sum = nums.get(l) + nums.get(r);
            if (sum < target) {
                res += (r - l);
                l++;
            } else {
                r--;
            }
        }
        return res;
    }
}
posted @ 2025-12-19 23:37  柳成荫y  阅读(1)  评论(0)    收藏  举报