1、LeetCode977 有序数组的平方
题目链接:977、有序数组的平方
思想:
暴力解法:各元素平方后再排序;
双指针法:平方后,数组最大的值在两端,不会在中间,所以比较左右两端的值,把大的放新数组的尾部。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k = nums.size() - 1;
vector<int> result(nums.size(), 0);
int i = 0;
int j = nums.size() - 1;
while(i<=j)
{
if (nums[i] * nums[i] < nums[j] * nums[j])
{
result[k--] = nums[j] * nums[j];
j--;
}
else
{
result[k--] = nums[i] * nums[i];
i++;
}
}
return result;
}
};
2、LeetCode209 长度最小的子数组
题目链接:209、长度最小的子数组
暴力解法
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result = INT32_MAX;
int sum = 0;
int subresult = 0;
for (int i = 0; i < nums.size(); i++)
{
sum = 0;
for (int j = i; j < nums.size(); j++)
{
sum += nums[j];
if (sum >= target)
{
subresult = j - i + 1;
result = result <= subresult ? result : subresult;
break;
}
}
}
result = result == INT32_MAX ? 0 : result;
return result;
}
};
滑动窗口
用一个for循环表示滑动窗口的终止位置,当sum>target时,起始位置向后移动。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result = INT32_MAX;
int sum = 0;
int subresult = 0;
int i = 0;
for (int j = 0; j < nums.size(); j++)
{
sum += nums[j];
while (sum >= target)
{
subresult = j - i + 1;
result = result < subresult ? result : subresult;
sum -= nums[i];
i++;
}
}
return result == INT32_MAX ? 0 : result;
}
};
3、LeetCode59 螺旋矩阵II
题目链接:59、螺旋矩阵II
思想:要找好边界点,左闭右开,循环int(n/2)次,新的一圈循环时起始位置++,结束位置--。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
int startx = 0;
int starty = 0;
int offset = 1;
int count = 1;
int i,j;
int mid = n / 2;
int Loop = n / 2;
while(Loop--)
{
i = startx;
j = starty;
for ( j = starty; j < n - offset; j++)
{
res[startx][j] = count++;
}
for ( i = startx; i < n - offset; i++)
{
res[i][j] = count++;
}
for (; j > starty; j--)
{
res[i][j] = count++;
}
for (; i > startx; i--)
{
res[i][j] = count++;
}
startx++;
starty++;
offset++;
}
if (n%2)
{
res[mid][mid] =count;
}
return res;
}
};
4、LeetCode76 最小覆盖子串(待补充)