数组算法
- 数组删除
- 双指针
数组删除
数组本质上是一个连续的储存空间,当开辟之后容量是不会改变的。(题目(27. 移除元素 - 力扣(LeetCode))
暴力解法
直接覆盖
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
for (int i = 0; i < size; i++) {
if (nums[i] == val) {
for (int j = i + 1; j < size; j++) {
nums[j - 1] = nums[j];
}
i--;
}
}
return size;
}
};
快速解法–双指针
应用场景
快慢指针可以直接在数组中进行覆盖操作
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;
}
};
这题因为是直接覆盖掉遇到的目标数字,所以可以用双指针一步到位,如果换成多目标值,就是条件变化其他没变。
题目2:26. 删除有序数组中的重复项 - 力扣(LeetCode)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow=0;
for(int fast=0;fast<nums.size();fast++){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
};
此题因为有序,无论升序还是降序都可以用双指针快速扫描出新的一个数组,得到无重复序列。但是如果数列无序如{1,2,1,1,2}则无法使用快慢指针进行一个筛选。
题目三844. 比较含退格的字符串 - 力扣(LeetCode)
```class Solution {
public:
string backspaceStr(string s){
int slow=0;
for(int fast;fast<s.size();fast++){
if(s[fast]!='#'){
s[slow]=s[fast];
slow++;
}else if(slow>0){
slow--;
}
}
return s.substr(0,slow);
}
bool backspaceCompare(string s, string t) {
return backspaceStr(s)= =backspaceStr(t);
}
};
这上面代码有些小问题,但是思路没有问题题目的解答也是用的双指针我不知道我那有问题,有没有好心人在评论区告诉我一下,
本文章基于代码随想录 (programmercarl.com)里面有动图演示和相关配套视频非常推荐大家用这个算法题单进行入门。这类文章相当于笔者自己做的笔记与总结。