LeetCode 977.有序数组的平方
题目链接:977.有序数组的平方
题目描述:给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100]
解题思路:
开辟一个新数组ans,将原数组区间分为正区间和负区间,指针i从负数区间中左端开始,指针j从正数区间中右端开始,比较过程中较大的数从右至左依次放置在ans数组中
代码:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int len = nums.size();
vector<int> ans(len,0);
int i = 0, j = len - 1, p = len - 1;
while(p >= 0)
{
int x = nums[i] * nums[i];
int y = nums[j] * nums[j];
if(x > y) ans[p--] = x, i++;
else ans[p--] = y, j--;
}
return ans;
}
};
题目特征:
非递减数组
元素平方后从小到大排列
LeetCode 209.长度最小的子数组
题目链接:209.长度最小的子数组
题目描述:给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的子数组
[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3]
是该条件下的长度最小的子数组。
解题思路:
双指针方法。
阶段1:慢指针不动,快指针向后移动直至双指针包裹区间数和大于target。
阶段2:快指针不动,慢指针向后移动直至双指针包裹区间和小于target。此期间求出子数组最小长度。
重复上述两步操作,直到数组末尾。
代码:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
if(nums.empty()) return 0;
int result = INT_MAX, sum = 0;
int i = 0,j = 0;
for(;j < nums.size(); j++)
{
sum += nums[j];
while(sum >= target)
{
int len = j - i + 1;
result = min(result,len);
sum -= nums[i++];
}
}
return result == INT_MAX ? 0 : result;
}
};
题目特征:
滑动窗口类问题
LeetCode 59.螺旋矩阵Ⅱ,54.螺旋矩阵Ⅰ,剑指Offer 29.顺时针打印矩阵
题目链接:59.螺旋矩阵Ⅱ,54.螺旋矩阵Ⅰ,剑指Offer 29.顺时针打印矩阵
题目解释:(三道题解题思路一模一样,故只展示59.螺旋矩阵Ⅱ)
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]
解题思路:
初始化边界和方向:
- 定义上下左右四个边界:
top
,bottom
,left
,right
。- 初始时,
top
为0,bottom
为矩阵的行数减1,left
为0,right
为矩阵的列数减1。- 定义一个方向数组
dirs
,表示遍历的顺序(右、下、左、上)。遍历矩阵:
- 使用一个循环,在每次循环中,根据当前方向(从右开始),遍历矩阵的元素。
- 在每次完成一个方向的遍历后,更新相应的边界,并切换到下一个方向。
终止条件:
- 当上下边界交错(
top > bottom
)或左右边界交错(left > right
)时,遍历结束,跳出循环。返回结果:
- 将遍历得到的元素存入一个列表,最后返回该列表。
代码:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> matrix(n,vector<int>(n));
int left = 0, right = n - 1, up = 0, down = n - 1;
int cnt = 1;
while(true)
{
for(int i = left; i <= right; i++) matrix[up][i] = cnt++;
if(++up > down) break;
for(int i = up; i <= down; i++) matrix[i][right] = cnt++;
if(--right < left) break;
for(int i = right; i>=left; i--) matrix[down][i] = cnt++;
if(--down < up) break;
for(int i = down; i >= up; i--) matrix[i][left] = cnt++;
if(++left > right) break;
}
return matrix;
}
};
题目特征:
矩阵螺旋式显示/插入