剑指 Offer II 数组


007. 数组中和为 0 的三个数

class Solution {
    public List> threeSum(int[] nums) {
        List> ans =new ArrayList();
        Arrays.sort(nums);
        int n=nums.length;

        for(int i=0;i0&&nums[i]==nums[i-1])continue;//因为排好序 以相同的数为起点 得到的三元组必定重复
            for(int j=i+1,k=n-1;ji+1&&nums[j]==nums[j-1])continue;
                while(nums[i]+nums[j]+nums[k]>0&&k>=j+2)k--;
                if(nums[i]+nums[j]+nums[k]==0)ans.add(Arrays.asList(nums[i],nums[j],nums[k]));
            }
        }
        return ans;
    }
}

008. 和大于等于 target 的最短子数组

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int ans=0x3f3f3f3f;//滑动窗口
        Queue  queue=new LinkedList();
        int sum=0;
        for(int i=0;i0&&sum-queue.peek()>=target)
            {
                sum-=queue.peek();
                queue.poll();
            }
            ans=Math.min(ans,queue.size());

        }
        return ans==0x3f3f3f3f?0:ans;

    }
}

009. 乘积小于 K 的子数组

class Solution {
    public int numSubarrayProductLessThanK(int[] nums, int k) {
        //固定i找最左边的j使得j乘到i=k)p/=nums[j++];//如果一个数比target大 所以要小于等于
           ans+=i-j+1;    
        }
        return ans;
    }
}