双指针
1双指针思想
2删除元素
2.1原地删除等于val的元素
-
双指针,快慢
快指针遍历,慢指针等待。
当nums[fast]==val时,fast移动,slow等待到不同时。
当nums[fast]!=val时,fast和slow一块移动。
public int removeElement(int[] nums, int val) { int slow=0; for(int fast=0;fast<nums.length;fast++){ if(nums[fast]!=val){ nums[slow]=nums[fast]; slow++; } } return slow; }
-
双指针,左右对撞
left找等于val的,right找不等于val的。用右边的替代左边。直到相遇。
public int removeElement(int[] nums, int val) { int left=0; int right=nums.length-1; for(left=0;left<=right;){ if(nums[left]==val&&nums[right]!=val){ int temp=nums[right]; nums[right]=nums[left]; nums[left]=temp; } if(nums[left]!=val) left++; if(nums[right]==val) right--; } return left; }
-
双指针,对撞加覆盖
left遍历,等于val,就用right覆盖。不等于val就往后。直到相遇。
public int removeElement(int[] nums, int val) { int right=nums.length-1; for(int left=0;left<=right;){ if(nums[left]==val){ nums[left]=nums[right]; right--; } else { left++; } } return right+1; }
2.2删除有序数组中的重复项
2.2.1保留一个重复值
快指针负责数组遍历,慢指针指向有效数组的最后一个位置。
slow=1
public static int removeDuplicates(int[] nums) { //slow表示可以放入新元素的位置,索引为0的元素不用管 int slow = 1; //循环起到了快指针的作用 for (int fast = 1; fast < nums.length; fast++) { //fast=1; if (nums[fast] != nums[slow - 1]) { nums[slow] = nums[fast]; slow++; } } return slow; }
2.2.2保留两个重复值
public int removeDuplicates(int[] nums) { if(nums.length<=2) return nums.length; int slow=2; for(int fast=2;fast<nums.length;fast++){ //fast=2 if(nums[fast]!=nums[slow-2]){ nums[slow]=nums[fast]; slow++; } } return slow; }
3元素奇偶移动
public int[] sortArrayByParity(int[] nums) { int left=0,right=nums.length-1; while(left<right){ if(nums[left]%2 > nums[right]%2){ int temp=nums[left]; nums[left]=nums[right]; nums[right]=temp; } if(nums[left]%2==0) left++; if(nums[right]%2==1) right--; } return nums; }
4数组轮转问题
public void rotate(int[] nums, int k) { k%=nums.length; reverse(nums,0,nums.length-1); reverse(nums,0,k-1); reverse(nums,k,nums.length-1); } public void reverse(int[] a,int start,int end){ while(start<end){ int temp=a[end]; a[end]=a[start]; a[start]=temp; start++; end--; } }
5数组的区间专题
%%%
public List<String> summaryRanges(int[] nums) { List<String> res=new ArrayList<>(); int slow=0; for(int fast=0;fast<nums.length;fast++){ if(fast+1==nums.length||nums[fast]+1!=nums[fast+1]){ //fast+1??? StringBuilder sb=new StringBuilder(); sb.append(nums[slow]); if(slow!=fast){ sb.append("->").append(nums[fast]); } res.add(sb.toString()); slow=fast+1; } } return res; }
lc163缺失的区间
6字符串替换空格问题
没有说清楚是针对于字符串还是针对于字符串数组,所以这里分类进行讨论
-
字符串
public String replaceSpace(String s) { String res=""; for(int i=0;i<s.length();i++){ char c=s.charAt(i); if(c==' '){ res+="%20"; } else { res+=c; } } return res; }
-
字符串数组
public String replaceSpace(String s) { int cnt=0; for }