代码随想录–数组部分
day2 数组第二天
一、力扣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 = k;
while(k+1)
{
if(nums[i] * nums[i] > nums[j] * nums[j])
{
result[k] = nums[i] * nums[i];
i ++;
}
else
{
result[k] = nums[j] * nums[j];
j --;
}
k --;
}
return result;
}
};
这个题用暴力法求解就是都求一遍二次方再排序,但是这太慢了
所以用双指针法,因为最大的二次方一定是在原本数组的两边
那么用i和j代表左右指针,搜索k次后一定是能够把结果数组填满的
比较两个指针下数字二次方的大小,对应填进去就行
二、力扣209–长度最小的子数组
代码随想录题目链接:代码随想录
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
暴力解法的话,就是两个循环搜索,一个记录所有相加≥s的子数组长度,一个选出其中最小的长度并输出,第一个搜索是 O ( n 2 ) O(n^2) O(n2)的复杂度,无敌慢
因为是连续子数组,所以用双指针搜索一次就行,只记录最短的子数组长度,等双指针搜索完一遍,结果已经记录好了
代码如下:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result = INT32_MAX;
int sum = 0;
int i = 0;
int j = 0;
while(j < nums.size())
{
sum += nums[j];
while(sum >= target)
{
if(result > (j - i + 1)) result = (j - i + 1);
sum -= nums[i];
i ++;
}
j ++;
}
return result == INT32_MAX ? 0 : result;
}
};
值得讲的就是while(sum >= target)这里,用while代替if-else判断显得代码漂亮了很多,而且也很好地处理了慢指针需要多次前进的情况。
三、力扣59–螺旋矩阵Ⅱ
代码随想录题目链接:代码随想录
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
这个题没什么算法可言,就是注意一下边界条件的判断,别越界就行,写C++的大家应该对内存管理和边界条件都比较熟悉了
代码如下:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n,vector<int>(n,0));
int top = 0;
int left = 0;
int botton = n - 1;
int right = n - 1;
int i = 1;
int j = 0;
while (i < n*n)
{
for (j = left; j < right; j ++,i ++) result[top][j] = i;
for (j = top; j < botton; j ++,i ++) result[j][right] = i;
for (j = right; j > left; j --,i ++) result[botton][j] = i;
for (j = botton; j > top; j --,i ++) result[j][left] = i;
top ++;
left ++;
botton --;
right --;
}
if (n % 2) {
result[n / 2][n / 2] = n*n;
}
return result;
}
};