双指针 1

11. 盛最多水的容器

题意:给n个非负整数代表垂直线的高度,找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

分析:要求最大容量,和底座长度以及垂直线高度相关:底座长度肯定越长越好,使用双指针从两端向中间遍历。每次移动 数字较小的那个指针。

class Solution {
    public int maxArea(int[] height) {
        int left=0,right=height.length-1,area=0,res=0;
        while(left<right){
            area = Math.min(height[left],height[right])*(right-left);
            res = Math.max(area,res);
            if(height[left]<height[right]) left++;
            else  right--;
        }
        return res;
    }
}

 

15. 三数之和

 题意:找出所有和为0的三个不同元素

   分析:从小到大排序,我们选出第一个数如果大于零直接break,然后我们在剩下的集合中使用双指针

  

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> ans = new ArrayList<>();
        for(int i=0;i<nums.length-2;i++){
            if(nums[i]>0) break;
            if(i>0&&nums[i]==nums[i-1]) continue;
            int left=i+1,right=nums.length-1;
            while(left<right){
                
                int sum = nums[i]+nums[left]+nums[right];
                if(sum<0){
                    while(left<right&&nums[left]==nums[++left]) ;
                }else if(sum>0){
                    while(left<right&&nums[right]==nums[--right]);
                }else{
                    ans.add(new ArrayList<>(Arrays.asList(nums[i],nums[left],nums[right])));
                    while(left<right&&nums[left]==nums[++left]) ;
                    while(left<right&&nums[right]==nums[--right]) ;
                }
            }
        }
        return ans;
    }
}

  

1. 两数之和

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map = new HashMap<>();
        for(int i=0; i<nums.length;i++){
            if(map.containsKey(target-nums[i])) return new int[]{map.get(target-nums[i]),i};
            map.put(nums[i], i);
        }
        return new int[]{-1,-1};
    }
}

  

posted @ 2021-07-20 14:01  petri  阅读(26)  评论(0)    收藏  举报