LeetCode之双指针(2)

75. Sort Colors
题目链接:

https://leetcode.com/problems/sort-colors/

题目描述:

一个数组中乱序放着数值0,1,2。将其按数值0,1,2的顺序重排。

比如[1,0,2] =>[0,1,2]

题目分析:

最直接的是计数排序,把0有多少个,1有多少个,2有多少个记录下来,然后在循环赋值。两次循环搞定。

如果要一次循环的话,用low与high指针,low代表第一个1所在下标位置,high代表第一个2所在下标位置。i循环遍历,当i与high相遇代表排好了,在遍历时如果nums[i]==0就与nums[low]交换,low++前进,i++前进,如果nums[i]==2就与nums[high]交换,high–前进。有一个需要注意,在nums[i]==2与nums[high]交换时,nums[high]存放的可能为0,也可能为1,当交换后nums[i]=0或1,如果i++,即i前进了,且如果nums[i]==0,就没有完成与nums[low]的交换,此时i位置的数,就相当于没有排。

代码:
class Solution {
public:
    void sortColors(vector<int>& nums) {
        int len=nums.size();
        int low=0,high=len-1;
        for(int i=0;i<=high;i++){
            if(nums[i]==0){
                swap(nums[low++],nums[i]);
            }
            else if(nums[i]==2){
                swap(nums[high--],nums[i--]);
            }
        }
    }
};
26. Remove Duplicates from Sorted Array
题目链接:

https://leetcode.com/problems/remove-duplicates-from-sorted-array/

题目描述:

不使用额外的空间,将排好序的数组中重复的元素去除。

题目分析:

唯一的难点就是不使用额外的空间。

代码:
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int len = nums.size();
        if (len == 0)
        {
            return 0;
        }
        int cnt = 1;
        for (int i = 1; i < len; i++)
        {
            if(nums[i]!=nums[cnt-1])
            {
                nums[cnt++] = nums[i];
            }
        }
        return cnt;
    }
};
80. Remove Duplicates from Sorted Array II
题目链接:

https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/

题目描述:

将一个排好序的数组,保证数组中每个数字最多出现两次的条件下,将数组中多余的元素去除,返回新数组的长度。

题目分析:

因为是排好序的,所以不是很麻烦。跟之前的那道题差不多啊。

代码:
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int len=nums.size();
        if(len<=2){
            return len;
        }
        int cur=2;
        for(int i=2;i<len;i++){
            if(nums[i]!=nums[cur-2]){
                nums[cur++]=nums[i];
            }
        }
        return cur;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值