代码随想录——数组——移除元素——双指针
目录
双指针法
leetcode实战:
283. 移动零 - 力扣(LeetCode)
844. 比较含退格的字符串 - 力扣(LeetCode)
977. 有序数组的平方 - 力扣(LeetCode)
双指针法
双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
定义快慢指针
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
-
// 时间复杂度:O(n) // 空间复杂度:O(1) class Solution { public:int removeElement(vector<int>& nums, int val) {int slowIndex = 0;for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {if (val != nums[fastIndex]) {nums[slowIndex++] = nums[fastIndex];}}return slowIndex;} };
注意这些实现方法并没有改变元素的相对位置!
- 时间复杂度:O(n)
- 空间复杂度:O(1)
自己理解:双指针通过两个指针对数组进行覆盖。
leetcode实战:
27. 移除元素 - 力扣(LeetCode)
class Solution {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];}}return slow;}
}
26. 删除有序数组中的重复项 - 力扣(LeetCode)
这里直接用上双指针 ,
nums[++solw]=nums[fast];
可以分解成: slow++;
num[slow]=nums[fast];
这里slow要++是因为要保留元素唯一。
class Solution {public int removeDuplicates(int[] nums) {int solw=0;for(int fast=0;fast<nums.length;fast++){if(nums[fast]!=nums[solw]){nums[++solw]=nums[fast];}}return solw+1;}
}
283. 移动零 - 力扣(LeetCode)
题解:
采用双指针,0是比较条件,可以把步骤分解为1.覆盖0元素 2.覆盖完后剩下的从slow 进行补零
class Solution {public void moveZeroes(int[] nums) {int slow=0;for(int fast=0;fast<nums.length;fast++){if(nums[fast]!=0){nums[slow++]=nums[fast];}}for(;slow<nums.length;slow++){nums[slow]=0;}}
}
844. 比较含退格的字符串 - 力扣(LeetCode)
还是利用双指针的思路,
这里要注意:
if(slow>0){
slow--;
}slow>0防止出现开头就是#的情况,不然slow会变成-1
这里slow--就是#的前一位,把他作为覆盖位,
最后 new String(s, 0, slow); 进行截取字符串,注意不要用 s.tocharAarry() 这个是将字符数组转化成字符串的地址。
class Solution {public boolean backspaceCompare(String s, String t) {String m= getstr(s.toCharArray());String n=getstr(t.toCharArray());return m.equals(n);}public String getstr(char s[]){int slow=0;for(int fast=0;fast<s.length;fast++){if(s[fast]!='#'){s[slow++]=s[fast];}else {if(slow>0){slow--;}}}return new String(s, 0, slow);}
}
977. 有序数组的平方 - 力扣(LeetCode)
思路:这里对每个数进行平方进行排序,可以利用双指针,最左指针和最右指针,两边指针所指向的平方数进行比较,大的一方放到一个新的数组里。
class Solution {public int[] sortedSquares(int[] nums) {int len=nums.length;int left=0;int right=nums.length-1;int result[]=new int[len];while(left<=right){if(nums[left]*nums[left]<nums[right]*nums[right]){result[--len]=nums[right]*nums[right];right--;}else{result[--len]=nums[left]*nums[left];left++;}}return result;}
}