Leetcdoe-Day7-代码随0想录-数组-移除元素-27-26-283-844-977

文章介绍了如何使用双指针技巧(快慢指针)解决一系列数组操作问题,如删除指定值、去除有序数组中的重复项、移动数组中的零、比较含退格的字符串以及处理有序数组的平方问题。
摘要由CSDN通过智能技术生成

27. 移除元素
题目链接
题解:快慢指针。因为数组的地址是连续的,不可以单独删除数组中的某个元素,因此考虑在数组中移动元素然后对有效位计数。快指针遍历数组,慢指针遇到target则开启元素移动。

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int fast=0,slow=0;
        for(fast=0;fast<nums.size();fast++){
            if(nums[fast]!=val){
                nums[slow]=nums[fast];
                slow++;
            }
        }
        return slow;
    }
};

在这里插入图片描述
26. 删除有序数组中的重复项
题目链接
题解:首先是有序数组,那么重复项一定是相邻的。其次心里一定要有双指针移动的动画,本质还是元素移动交换。把握数量关系,nums[fast+1]==nums[fast]则继续前进,nums[fast+1]!=nums[fast]则做交换。

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if(nums.size()==0) return 0;
        int slow=0,fast=0;
        for(fast=0;fast<nums.size()-1;fast++){
            if(nums[fast+1]!=nums[fast]){
                slow++;
                nums[slow]=nums[fast+1];
                
            }
        }
        return slow+1;
    }
};

在这里插入图片描述
283. 移动零
题目链接
题解:同样是快慢指针,遇到零则交换,而不是取代。

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
    int slow=0,fast=0;
    int temp;
    for(fast=0;fast<nums.size();fast++){
        if(nums[slow]==0){
            if(nums[fast]!=0){
                temp=nums[slow];
                nums[slow]=nums[fast];
                nums[fast]=temp;
                slow++;
            }
        }
        if(nums[slow]!=0) slow++;
    }

        
    }
    
};

在这里插入图片描述
844. 比较含退格的字符串
题目链接
题解:用栈的方法比较好理解。这里用字符串来模拟栈,进栈直接+,出栈用pop_back()函数,这里要熟知string的常用函数。

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int fast=0,slow=0;
        for(fast=0;fast<nums.size();fast++){
            if(nums[fast]!=val){
                nums[slow]=nums[fast];
                slow++;
            }
        }
        return slow;
    }
};

在这里插入图片描述
也可以用双指针的方法来解决,但是最后的比对字符串部分比较复杂,要考虑很多种情况。

class Solution {
public:
    bool backspaceCompare(string s, string t) {
    int S=s.size()-1;
    int T=t.size()-1;
    int snum=0,tnum=0;
    while(S>=0||T>=0)
    {
        while(S>=0){
            if(s[S]=='#') {
                snum++;
                S--;
            }
            else if(snum>0){
                snum--;
                S--;
            }
            else {break;}
        }
        while(T>=0){
            if(t[T]=='#'){
                tnum++;
                T--;
            }else if(tnum>0){
                tnum--;
                T--;
            }else {break;}
        }

        // 后半部分#消除完了,接下来比较S[i] != T[j]
            if (S < 0 || T < 0) break; // S 或者T 遍历到头了
            if (s[S] != t[T]) return false;
            S--;T--;
        }
        // 说明S和T同时遍历完毕
        if (S == -1 && T == -1) return true;
        return false;

  }
    
};

在这里插入图片描述
977. 有序数组的平方
题目链接
题解:新开一个和原数组一样大小的数组用来存放结果。一共两种情况,一种是所有数字都大于等于零,则不存在数组以移位情况直接平方输出。第二种情况就是nums的两头为正负数,则可能存在负数平方后需要移动到数组后方,采用双指针,从两头开始往中间找,因为两头最大中间小。

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        if(nums[0]>=0){
            for(int i=0;i<nums.size();i++){
                nums[i]=nums[i]*nums[i];
            }
            return nums;
        }
        int i=0;
        int j=nums.size()-1;
        int k=nums.size()-1;
        vector<int> result(nums.size(),0);
        while(j>=i){
            if(nums[i]*nums[i]>nums[j]*nums[j]){
                result[k--]=nums[i]*nums[i];
                i++;
            }else{
                result[k--]=nums[j]*nums[j];
                j--;
            }

        }
        return result;
    }
};

在这里插入图片描述

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值