75. 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;
}
};