盛最多水的容器
解法一
双指针
left指向左边,right指向右边
如果num[left] <= num[right] 那么left++反之righht–
因为盛水靠矮的一方
class Solution { public int maxArea(int[] height) { int len = height.length; if(len <= 1) return 0; int left = 0; int right = len-1; int res = 0; while(left < right){ res = Math.max(res,Math.min(height[left],height[right])*(right-left)); if(height[left] <= height[right]) left++; else if(height[left] > height[right]) right--; } return res; } }
三数之和
解法一
双指针
先进行排序,然后遍历当前num[i] + num[left] +num[right] 与 0 的大小
如果大于0所以right–;
如果小于0所以left++
class Solution { public List<List<Integer>> threeSum(int[] nums) { int len = nums.length; List<List<Integer>> list = new ArrayList<>(); if(len < 3) return list; Arrays.sort(nums); for(int i = 0;i < len;i++){ if(i > 0 && nums[i-1] == nums[i]) continue; int left = i + 1; int right = len-1; while(left < right){ if(nums[i] + nums[left] + nums[right] == 0){ // System.out.println(i+"=="+left+"=="+right); List<Integer> t = new ArrayList<>(); t.add(nums[i]); t.add(nums[left]); t.add(nums[right]); list.add(t); while(left < right && nums[left+1] == nums[left]) left++; while(left < right && nums[right-1] == nums[right]) right--; left++; right--; }else if(nums[i] + nums[left] + nums[right] > 0){ right--; }else left ++; } } return list; } }
移动零
解法一
class Solution { public void moveZeroes(int[] nums) { int len = nums.length; if(len == 0) return; int right = 0; for(int i = 0;i < len;i++){ if(nums[i] != 0){ nums[right++] = nums[i]; } } for(int i = right;i < len;i++){ nums[i] = 0; } return; } }