题目描述:给你一个按 非递减顺序 排序的整数数组
nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。进阶:请你设计时间复杂度为
O(n)
的算法解决本问题
示例:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
我的解答方法:先平方,再冒泡排序,再输出;看来是昨天双指针掌握的并不好,我都想不到时间复杂度为O(n)的解法。
我的方法代码(已通过):
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums){
cout<<"[";
for(int i=0;i<nums.size();i++){
nums[i] *= nums[i];
//cout<<nums[i]<<",";
}
for(int i=0;i<nums.size()-1;i++){
for(int j=i+1;j<nums.size();j++){
if(nums[j]<nums[i]){
int t=nums[i];
nums[i]=nums[j];
nums[j]=t;
}
}
}
for(int i=0;i<nums.size();i++){
cout<<nums[i]<<",";
}
return nums;
}
};
学习了双指针解法:新建了一个数组,算是用空间换时间吗;最大元素一定在两端。
具体代码(while循环版本):
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums){
vector<int> result(nums.size(),0);
int i=0;
int j,k;
j=k=nums.size()-1;
while(i<=j){
if(nums[i]*nums[i]>=nums[j]*nums[j]){
result[k--]=nums[i]*nums[i];
i++;
}else{
result[k--]=nums[j]*nums[j];
j--;
}
}
return result;
}
};
题目二:209.长度最小的子数组
题目描述:给定一个含有
n
个正整数的数组和一个正整数target
。找出该数组中满足其总和大于等于target
的长度最小的子数组[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回0
。
我的暴力求解法(超时了啊偶~):
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int min_sum=0;
//暴力求解,起始位置i,终止位置j
int min_len=nums.size()+1;
int len=0;
for(int i=0;i<nums.size();i++){
min_sum=0;
for(int j=i;j<nums.size();j++){
min_sum += nums[j];
if(min_sum>=target){
len=j-i+1;
min_len = min_len<len ? min_len:len;
break;
}
}
}
if(min_len != nums.size()+1){
return min_len;
}else{
return 0;
}
}
};
学习滑动窗口法:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int i=0; // 滑动窗口起始位置
int sum=0;//滑动窗口数值之和
int len,min_len;
len=min_len=nums.size()+1;
//终止位置指针逐个移动:前一个元素的和、前两个元素的和、前三个元素的和...————>找到sum>=target
//————>起始位置指针逐个向后移动,sum减去第一个元素,再减去第二个元素...
for(int j=0;j<nums.size();j++){//窗口的终止位置怎么移动?
sum += nums[j];
while(sum>=target){
len=j-i+1;
min_len = len<min_len ? len:min_len;
sum -= nums[i++];//起始位置怎么移动?
}
}
return min_len==nums.size()+1 ? 0:min_len;
}
};
题目三:59.螺旋矩阵II
题目建议: 本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录
视频讲解:一入循环深似海 | LeetCode:59.螺旋矩阵II_哔哩哔哩_bilibili
题目描述:给你一个正整数
n
,生成一个包含1
到n2
所有元素,且元素按顺时针顺序螺旋排列的n x n
正方形矩阵matrix
。
示例:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
好像会写,但是又独立写不出来......
代码:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n,vector<int>(n,0));
//定义上下左右侧的边界
int up = 0;
int down = n-1;
int left = 0;
int right = n-1;
int num = 1;//要填充的数字
while(num<=n*n){
//向右
for(int j=left;j<=right;j++){
res[up][j]=num++;
}
up++;
//向下
for(int i=up;i<=down;i++){
res[i][right]=num++;
}
right--;
//向左
for(int j=right;j>=left;j--){
res[down][j]=num++;
}
down--;
//向上
for(int i=down;i>=up;i--){
res[i][left]=num++;
}
left++;
}
return res;
}
};