数组删除算法--c++

数组算法

  • 数组删除
  • 双指针
    数组删除
    数组本质上是一个连续的储存空间,当开辟之后容量是不会改变的。(题目(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)里面有动图演示和相关配套视频非常推荐大家用这个算法题单进行入门。这类文章相当于笔者自己做的笔记与总结。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
请用C++解决这个leetcode的问题:2653. 滑动子数组的美丽值 提示 中等 26 相关企业 给你一个长度为 n 的整数数组 nums ,请你求出每个长度为 k 的子数组的 美丽值 。 一个子数组的 美丽值 定义为:如果子数组中第 x 小整数 是 负数 ,那么美丽值为第 x 小的数,否则美丽值为 0 。 请你返回一个包含 n - k + 1 个整数的数组,依次 表示数组中从第一个下标开始,每个长度为 k 的子数组的 美丽值 。 子数组指的是数组中一段连续 非空 的元素序列。 示例 1: 输入:nums = [1,-1,-3,-2,3], k = 3, x = 2 输出:[-1,-2,-2] 解释:总共有 3 个 k = 3 的子数组。 第一个子数组是 [1, -1, -3] ,第二小的数是负数 -1 。 第二个子数组是 [-1, -3, -2] ,第二小的数是负数 -2 。 第三个子数组是 [-3, -2, 3] ,第二小的数是负数 -2 。 示例 2: 输入:nums = [-1,-2,-3,-4,-5], k = 2, x = 2 输出:[-1,-2,-3,-4] 解释:总共有 4 个 k = 2 的子数组。 [-1, -2] 中第二小的数是负数 -1 。 [-2, -3] 中第二小的数是负数 -2 。 [-3, -4] 中第二小的数是负数 -3 。 [-4, -5] 中第二小的数是负数 -4 。 示例 3: 输入:nums = [-3,1,2,-3,0,-3], k = 2, x = 1 输出:[-3,0,-3,-3,-3] 解释:总共有 5 个 k = 2 的子数组。 [-3, 1] 中最小的数是负数 -3 。 [1, 2] 中最小的数不是负数,所以美丽值为 0 。 [2, -3] 中最小的数是负数 -3 。 [-3, 0] 中最小的数是负数 -3 。 [0, -3] 中最小的数是负数 -3 。 提示: n == nums.length 1 <= n <= 105 1 <= k <= n 1 <= x <= k -50 <= nums[i] <= 50
05-24

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值