977.有序数组的平方(简单)
题目链接:977.有序数组的平方
- 题目描述:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
- 题目建议: 本题关键在于理解双指针思想
方法一:暴力解法
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for(int i = 0; i < nums.size() ; i++){//依次算出元素平方并替换
nums[i] *= nums[i];
}
sort(nums.begin(),nums.end());//快速排序
return nums;
}
};
方法二:双指针法
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> result(nums.size(),0);//声明一个和原数组大小一样的结果数组,并且元素全赋为0
int k = nums.size() - 1;//k指向result数组的最后一个位置
int i = 0, j = nums.size()-1;//定义头尾两个指针
while(k >= 0){//k==0有效 因此切记别弄丢k[0] 否则例二过不了
if(nums[i] * nums[i] > nums[j] * nums[j]){//对比两个元素平方大小,大的放入res数组中k所指的位置
result[k--] = nums[i] * nums[i];
i++;
} else{
result[k--] = nums[j] * nums[j];
j--;
}
}
return result;
}
};
这里需要注意的是k的循环条件,必须是k>=0,否则会少一次判断从而会导致用例二的不通过。如下图
209.长度最小的子数组(中等)
题目链接:
209.长度最小的子数组
- 题目描述:给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其元素和 ≥ target 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的子数组,返回 0 。:
- 题目建议:着重理解滑动窗口
方法一:暴力解法
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int reslut = INT32_MAX;
int sublength; //子数组的长度
int sum; //子数组元素之和
for (int i = 0; i < nums.size(); i++){//子序列的起点为i
sum = 0;
for(int j = i; j < nums.size(); j++){//子序列终止位置为j
sum += nums[j];
if(sum >= s){//一旦子序列之和超过s,则取子序列的长度并更新reslut
sublength = j - i + 1; //取子序列的长度
reslut = reslut < sublength ? reslut : sublength;//其实就是不断取满足条件的更短子序列长度
break;
}
}
}
//若result的值没有改变,则返回0,说明没有符合条件的子序列
return reslut == INT32_MAX ? 0 :reslut;
}
};
注:INT32_MAX:是个很大的数,如果想得到数组中最小值,可以先将min1(下方代码中的一个变量)设成INX_MAX,这样就不需要const int定义一个很大的数了,还有很多地方都可以使用它。
INT_MAX和INT_MIN
方法二:滑动窗口
暴力解法中,第一个for循环滑动窗口的起始位置,第二个for循环滑动窗口的终止位置,使用了两个for循环完成了一个不断搜索区间的过程。而滑动窗口则是只使用一个for循环来完成工作。
思路:寻找子序列势必需要考虑窗口的起始和终止位置,那么滑动窗口法所使用的的一个for循环是用于表示窗口起始位置还是终止位置呢,若表示起始位置,那么遍历剩下的终止位置成为了一个棘手的问题;故考虑将其用于表示窗口的终止位置。
!!!着重理解while循环中sum - = nums[i++];
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int reslut = INT32_MAX; //求最小值,故先假定结果为一个很大的数
int sublength = 0; //滑动窗口的长度
int sum= 0; //滑动窗口的元素之和
int i = 0; //滑动窗口的起始位置
for(int j = 0; j < nums.size(); j++){//子序列终止位置为j
sum += nums[j];
while(sum >= s){//使用while,每次更新i位置,并且不断比较子序列是否一旦子序列符合条件,取子序列的长度并更新reslut
sublength = j - i + 1; //取子序列的长度
reslut = reslut < sublength ? reslut : sublength;//其实就是不断取满足条件的更短子序列长度
sum -= nums[i++];//不断变更i(滑动窗口的起始位置),先减去当前i处元素再往后移动
}
}
//若result的值没有改变,则返回0,说明没有符合条件的子序列
return reslut == INT32_MAX ? 0 :reslut;
}
};
59. 螺旋矩阵 II(中等)
题目链接:螺旋矩阵 II
- 题目描述:给你一个正整数 n ,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
- 题目建议: