1. 两数平方和:https://leetcode-cn.com/problems/sum-of-square-numbers/

    class Solution {
     public boolean judgeSquareSum(int c) {
         //左右指针,左指针0,右指针为c的开平方
         int left = 0;
         int right = (int)Math.sqrt(c);
    
         while(left <= right){
             //中间值为左的平方 + 右的平方
             int middle = left*left + right*right;
             if(middle < c){
                 left++;
             }else if(middle > c){
                 right--;
             }else{
                 return true;
             }
         }
         return false;
     }
    }
  2. 盛水容器:https://leetcode-cn.com/problems/container-with-most-water/submissions/

    class Solution {
     public int maxArea(int[] height) {
         if(height.length == 0){
             return 0;
         }
    
         int left = 0;
         int right = height.length-1;
    
         int result = 0;
         while(left <= right){
             //左比右高,提取右为高,right--。右比左高,提取左为高,left++
             if(height[left] > height[right]){
                 int high = height[right];
                 int width = right-left;
                 result = Math.max(result,high*width);
                 right--;
             }else{
                 int high = height[left];
                 int width = right-left;
                 result = Math.max(result,high*width);
                 left++;
             }
         }
         return result;
     }
    }
  3. 三数之和:https://leetcode-cn.com/problems/3sum/

    class Solution {
     public List<List<Integer>> threeSum(int[] nums) {
    
         List<List<Integer>> result = new ArrayList<>();
         if(nums.length == 0){
             return result;
         }
    
         //排序,后续遍历时,当元素大于0就截止
         Arrays.sort(nums);
    
         for(int i=0;i<nums.length;i++){
             //如果元素已经大于0,break
             if(nums[i] > 0){
                 break;
             }
             //去重
             if(i > 0 && nums[i] == nums[i-1]){
                 continue;
             }
             //双指针
             int left = i+1;
             int right = nums.length-1;
             while(left < right){
                 int sum = nums[i]+nums[left]+nums[right];
                 if(sum == 0){
                     //添加和为0的三个元素
                     result.add(Arrays.asList(nums[i],nums[left],nums[right]));
                     //判断后续重复
                     while(left < right && nums[left] == nums[left+1]){
                         left++;
                     }
                     while(left < right && nums[right] == nums[right-1]){
                         right--;
                     }
                     left++;
                     right--;
                 }else if(sum < 0){
                     left++;
                 }else if(sum > 0){
                     right--;
                 }
             }
         }
         return result;
     }
    }
  4. 最接近的三数之和:https://leetcode-cn.com/problems/3sum-closest/submissions/

    class Solution {
     public int threeSumClosest(int[] nums, int target) {
         //先排序
         Arrays.sort(nums);
    
         //初始化result为前三个数的和
         int result = nums[0]+nums[1]+nums[2];
    
         //遍历
         for(int i=0;i<nums.length;i++){
             //双指针
             int left = i+1;
             int right = nums.length-1;
             while(left < right){
                 //三数之和
                 int sum = nums[i]+nums[left]+nums[right];
                 //如果sum和target的差值比result和target的差值小,说明sum的三个值更接近
                 if(Math.abs(sum-target) < Math.abs(result-target)){
                     result = sum;
                 }else if(sum == target){
                     return result;
                 }else if(sum < target){
                     left++;
                 }else if(sum > target){
                     right--;
                 }
             }
         }
         return result;
     }
    }
  5. 接雨水:https://leetcode-cn.com/problems/trapping-rain-water/

    class Solution {
     public int trap(int[] height) {
         if(height.length == 0){
             return 0;
         }
    
         //从左往右,存最大值
         int[] left = new int[height.length];
         for(int i=1;i<height.length;i++){
             left[i] = Math.max(left[i-1],height[i-1]);
         }
    
         //从右往左,存最大值
         int[] right = new int[height.length];
         for(int i=height.length-2;i>=0;i--){
             right[i] = Math.max(right[i+1],height[i+1]);
         }
    
         int result = 0;
         //从1到height.lengt-2
         for(int i=1;i<height.length-1;i++){
             //提取最小值
             int min = Math.min(left[i],right[i]);
             //如果min比height[i]大,叠加差值
             if(min > height[i]){
                 result += min-height[i];
             }
         }
         return result;
     }
    }
  6. 荷兰国旗:https://leetcode-cn.com/problems/sort-colors/

    class Solution {
     public void sortColors(int[] nums) {
         //三指针
         int left = 0;
         int right = nums.length-1;
         int cur = 0;
    
         while(cur <= right){
             //left控制0,当cur为0时,交换cur和left,因为left已经搜索过了,left++,cur++
             if(nums[cur] == 0){
                 int temp = nums[cur];
                 nums[cur] = nums[left];
                 nums[left] = temp;
                 left++;
                 cur++;
             }else if(nums[cur] == 2){
                 //right控制2,当cur为2时,交换cur和right,因为right未搜索,cur不能++
                 int temp = nums[cur];
                 nums[cur] = nums[right];
                 nums[right] = temp;
                 right--;
             }else{
                 cur++;
             }
         }
     }
    }
  7. 移动0:https://leetcode-cn.com/problems/move-zeroes/submissions/

    class Solution {
     public void moveZeroes(int[] nums) {
         int left = 0;
         for(int right=0;right<nums.length;right++){
             //不为0时,right和left交换,left++
             if(nums[right] != 0){
                 int temp = nums[right];
                 nums[right] = nums[left];
                 nums[left] = temp;
                 left++;
             }
         }
     }
    }
  1. 寻找重复数(floyd判圈):https://leetcode-cn.com/problems/find-the-duplicate-number/

    class Solution {
     public int findDuplicate(int[] nums) {
         //flyid判圈法,数组模拟链表:fast[nums[fast]]和nums[slow]
    
         //快慢指针
         int slow = 0;
         int fast = 0;
         slow = nums[slow];
         fast = nums[nums[fast]];
    
         //寻找重复,快走2慢走1
         while(slow != fast){
             slow = nums[slow];
             fast = nums[nums[fast]];
         }
    
         //重置快指针,快慢一起走
         fast = 0;
         while(slow != fast){
             slow = nums[slow];
             fast = nums[fast];
         }
         return fast;
     }
    }
  1. 使奇数位于偶数前:https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/submissions/
  1. 和为S的连续序列:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/submissions/

    class Solution {
    public int[][] findContinuousSequence(int target) {
        //使用List暂存
        List<int[]> result = new ArrayList<>();
    
        //快慢指针,初始为
        int slow = 1;
        int fast = 1;
        int sum = 0;
        //阈值,达到一半即可
        while(slow <= target/2){
            if(sum < target){
                sum += fast;
                fast++;
            }else if(sum > target){
                sum -= slow;
                slow++;
            }else if(sum == target){
                int start = slow;
                int[] temp = new int[fast - slow];
                for(int i=0;i<temp.length;i++){
                    temp[i] = start++;
                }
                result.add(temp);
                sum -= slow;
                slow++;
            }
        }
        return result.toArray(new int[result.size()][]);
    }
    }