有序数组的平方
题目链接: leetcode.cn/problems/sq…
解题思路
- 遍历整个数组,定义一个长度为数组长度的空数组。
- 每次遍历的过程中,判断后面一个元素和前面一个元素的大小
- 将头尾两个元素中比较大的那一个放入空数组的末尾
- 遍历完整之后,返回新建的数组
代码实现
// 双指针法
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k=nums.size()-1;
vector<int> ret(nums.size(),0);
for(int i=0,j=nums.size()-1;i<=j;){
if(abs(nums[i])<abs(nums[j])){
ret[k--]=pow(nums[j],2);
j--;
}
else{
ret[k--]=pow(nums[i],2);
i++;
}
}
return ret;
}
};
// 暴力
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for(int i=0;i<nums.size();i++){
nums[i]=nums[i]*nums[i];
}
sort(nums.begin(),nums.end());
return nums;
}
};
长度最小的子数组
题目链接: leetcode.cn/problems/mi…
实现思路
- 首先我们得到一个数组和一个目标值
- 我们将数组进行遍历操作,定义最后要返回的值result,和中间的操作量subLength
- 定义一个变量j为滑动窗口的尾节点。每次我们得到的区间数组和如果说大于target的话,那么我们就对其进行删除头操作
- 最后将遍历数组过程中得到的result给他返回回去
代码实现
// 滑动窗口实现
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result=INT_MAX;
int i=0;
int sum=0;
int subLength=0;
for(int j=0;j<nums.size();j++){
sum+=nums[j];
while(sum>=target){
subLength=(j-i+1);
result=min(result,subLength);
sum-=nums[i++];
}
}
return result==INT_MAX?0:result;
}
};
螺旋矩阵II
题目链接: leetcode.cn/problems/sp…
代码实现
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0)); // 使用vector定义一个二维数组
int startx = 0, starty = 0; // 定义每循环一个圈的起始位置
int loop = n / 2; // 每个圈循环几次,例如n为奇数3,那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理
int mid = n / 2; // 矩阵中间的位置,例如:n为3, 中间的位置就是(1,1),n为5,中间位置为(2, 2)
int count = 1;
int offset = 1;
int i,j;
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 += 1;
}
if (n % 2) {
res[mid][mid] = count;
}
return res;
}
};