-
26.删除排序数组中的重复项
-
示例 1:
输入:nums = [1,1,2] 输出:2, nums = [1,2,_] 解释:函数应该返回新的长度 2,并且原数组 nums 的前两个元素被修改为1, 2。 不需要考虑数组中超出新长度后面的元素。
-
思路:
- 可以用双指针方法来遍历数组,定义一个fast指针用来遍历,一个slow指针用来确定遍历之后满足条件的数组的大小,当满足nums[fast] != nums[fast - 1]时,就nums[slow] = nums[fast],然后让slow增加,所以综合下来是nums[slow ++] = nums[fast]。
-
class Solution { public: int removeDuplicates(vector<int>& nums) { int slow = 1, fast = 1; //slow就是最后数组的大小,fast是用来遍历数组的 int n = nums.size(); if(n == 0) return 0; while(fast < nums.size()) { if(nums[fast] != nums[fast - 1]) { nums[slow ++] = nums[fast]; } fast ++; } return slow; } };
-
283.移动零
思路:也是双指针的方法,定义left指针和right指针,让right指针去遍历,如果nums[right] != 0就让nums[left]和nums[right]交换,并且让left++更新,如果等于0就让right++。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int left = 0, right = 0, n = nums.size();
while(right < n)
{
if(nums[right])
{
swap(nums[right], nums[left]);
left ++;
}
right ++;
}
}
};
-
844.比较含退格的字符串
class Solution {
public:
string building(string &s)
{
string ret;
for(auto c : s)
{
if(c != '#')
{
ret.push_back(c);
}
else if(!ret.empty())
{
ret.pop_back();
}
}
return ret;
}
bool backspaceCompare(string s, string t) {
return building(s) == building(t);
}
};
59.螺旋矩阵II
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int count = 1;// 开始的数字大小
int offset = 1;// 需要控制每一条边遍历的长度,每次循环右边界收缩一位
int loop = n / 2;//循环次数
int mid = n / 2;//中间位置
int startX = 0, startY = 0;
int i, j;
vector<vector<int>> ret(n, vector<int>(n, 0));
while(loop --)
{
i = startX, j = startY;
for(j = startY; j < n - offset; j++)
{
ret[startX][j] = count++;
}
for(i = startX; i < n - offset; i ++)
{
ret[i][j] = count++;
}
for(;j > startY; j--)
{
ret[i][j] = count++;
}
for(; i > startX; i--)
{
ret[i][j] = count++;
}
startX ++;
startY ++;
offset += 1;
}
if(n % 2)
{
ret[mid][mid] = count;
}
return ret;
}
};