开一个刷题博客,长期更新。
目录
26. Remove Duplicates from Sorted Array
Array
27. Remove Element
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int j = nums.size()-1;
for(int i = 0;i<=j;) //注意这个地方的条件是i<=j
{
if(nums[i] == val)
swap(nums[i], nums[j--]);
else
++i;
}
return j+1;
}
};
26. Remove Duplicates from Sorted Array
1. 基础版本
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.empty())
return 0;
int i = 0;
for(int j = 1;j<nums.size();++j)
{
if(nums[i]!=nums[j])
swap(nums[++i], nums[j]); //这个地方会消耗大量赋值操作
}
return i+1;
}
};
2. 小改进版本
并不用维护整个数组的元素,交换操作可以不用
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.empty())
return 0;
int i = 0;
for(int j = 1;j<nums.size();++j)
{
if(nums[i]!=nums[j])
{
i++;
if(i!=j) //这个地方也算一个优化,
nums[i] = nums[j];
//其实,上面几句用nums[++i] = nums[j]也可以,不过这样每次都要进行赋值操作,当处理没有重复元素的数组时,可以不必交换
}
}
return i+1;
}
};
80. Remove Duplicates from Sorted Array II
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int size = nums.size();
if(size<3)
return size;
int pos = 2; //pos标记当前需要处理的位置
for(int i = 2;i<nums.size();++i)
{
if(nums[i] != nums[pos-2])
{
if(pos != i) //同样,只有当pos!=i时需要复制
nums[pos] = nums[i];
pos++;
}
}
return pos;
}
};
277. Find the Celebrity
bool knows(int a, int b);
class Solution
{
public:
int findCelebrity(int n)
{
int tar = 0;
for (int i = 1; i < n; ++i)
tar = knows(i, tar) ? tar : i;
for (int i = 0; i < n; ++i)
{
if (i != tar && (knows(tar, i) || !knows(i, tar)))
return -1;
}
return tar;
}
};
189. Rotate Array
class Solution {
public:
void rotate(vector<int>& nums, int k) {
reverse(nums.begin(), nums.end());
k = k%nums.size();
reverse(nums.begin(), nums.begin()+k);
reverse(nums.begin()+k, nums.end());
}
};
41. First Missing Positive
迭代器算法
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int num = 1;
while(find(nums.begin(), nums.end(), num)!=nums.end())
num++;
return num;
}
};
下标索引
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int res;
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;
}
};
299. Bulls and Cows
class Solution {
public:
string getHint(string secret, string guess) {
vector<int> s(10, 0);
int cowCount = 0;
int len = secret.size();
for (int i = 0; i < len; ++i)
{
if (secret[i] == guess[i])
++cowCount;
else
++s[secret[i]-'0'];
}
int bullCount = 0;
for (int i = 0; i < len; ++i)
if (secret[i] != guess[i] && s[guess[i]-'0'] > 0)
{
++bullCount;
--s[guess[i]-'0'];
}
return to_string(cowCount) + 'A' + to_string(bullCount) + 'B';
}
};