1.Remove Element
这个一开始自己没想那么多,就直接erase删除。
代码:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
for(int i=0;i<nums.size();i++)
{
if(nums[i]==val)
{
nums.erase(nums.begin()+i);
i--;
}
}
return nums.size();
}
};
提交后看到评论,感觉直接用数组偏移来做比较好
代码:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int shift_left=0;
for(int i=0;i<nums.size();i++)
{
if(nums[i]==val)
{
shift_left++;
}else if(shift_left>0)
{
nums[i-shift_left]=nums[i];
}
}
return nums.size()-shift_left;
}
};
2.Remove Duplicates from Sorted Array
这里就直接用数组偏移
代码:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size()==0)return 0;
int shift_left=0;
int lastnum=nums[0];
for(int i=1;i<nums.size();i++)
{
if(nums[i]==lastnum)
{
shift_left++;
}
else if(shift_left>0)
{
nums[i-shift_left]=nums[i];
}
lastnum=nums[i];
}
return nums.size()-shift_left;
}
};
3.Remove Duplicates from Sorted Array II
这里还是用上面偏移办法做
代码:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size()==0)return 0;
int shift=0;
int lastnum=nums[0],counts=0;
for(int i=1;i<nums.size();i++)
{
if(nums[i]==lastnum)
{
counts++;
if(counts>1)
{
shift++;
}
}
else
{
counts=0;
}
nums[i-shift]=nums[i];
lastnum=nums[i];
}
return nums.size()-shift;
}
};
但是又一次看了评论大神的代码,发现了本质是一样但是利用了写代码技巧
代码:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int i = 0;
for (int n : nums)
if (i < 2 || n > nums[i-2])
nums[i++] = n;
return i;
}
};
这里用i做标记,由于数组开头每2个数字后第3个数字一定大于第一个数字,所以当不大于的时候i就不跟着n进行增加并记录着这个第3个开始重复的数字,直到大于的时候用大于的数字替换掉当初记着的第3个重复数字,后面就以此类推完成循环。
值得借鉴的是这样写法 if(i<2 || 条件) 这里就可以避免一些i在数组中不能取的情况,发现自己以前笨得都不会这样来写。
4.Find the Celebrity
5.Rotate Array
这里最简单方法是另开个数组,循环一遍。
另外还有个O(1)方法使用逆序
a1 a2 a3 .... an 先逆序a1 ... an-k,再逆序 an-k+1 ... an,最后再全部逆序一遍就可以了
代码:
class Solution {
public:
void rotate(vector<int>& nums, int k) {
k=k%nums.size();
int n=nums.size();
reverse(nums.begin(),nums.end()-k);
reverse(nums.end()-k,nums.end());
reverse(nums.begin(),nums.end());
}
};
6.First Missing Positive
这里利用下标,将每个正数交换到它应该在的对应下标上,最后循环一遍看第一个不对应值的下标然后返回即可。
代码:
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
for(int i=0;i<nums.size();i++)
{
while(nums[i]>0 && nums[i]<=nums.size() && nums[nums[i]-1]!=nums[i])
{
swap(nums[i],nums[nums[i]-1]);
}
}
for(int i=0;i<nums.size();i++)
{
if(nums[i]!=i+1)
return i+1;
}
return nums.size()+1;
}
};