LeetCode之双指针(2)

来源:互联网 发布:礼券自助提货系统源码 编辑:程序博客网 时间:2024/05/18 16:17

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;    }};
0 0
原创粉丝点击