1.有序数组的平方
题目:leetcode977
第一想法用快排解决代码如下:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for(int i=0;i<nums.size();i++){
nums[i] *=nums[i];
}
sortqucik(nums,0,nums.size()-1);
return nums;
}
void sortqucik(vector<int>& nums,int left,int right){
if(left<right){
int mid = Pattion(nums,left,right);
sortqucik(nums,left,mid -1);
sortqucik(nums,mid+1,right);
}
}
int Pattion(vector<int>& a,int low,int high){
int pivoty=a[low];
while(low<high){
while(a[high]>=pivoty&&low<high) high--;
a[low]=a[high];
while(a[low]<=pivoty&&low<high) low++;
a[high]=a[low];
}
a[low]=pivoty;
return low;
}
};
然后看过视频之后有更简便的解法:
主要思路如下:
定义一个新数组result,和A数组一样的大小,让k指向result数组终止位置。
如果A[i] * A[i] < A[j] * A[j] 那么result[k–] = A[j] * A[j]; 。
如果A[i] * A[i] >= A[j] * A[j] 那么result[k–] = A[i] * A[i]; 。
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
int k = A.size() - 1;
vector<int> result(A.size(), 0);
for (int i = 0, j = A.size() - 1; i <= j;) { // 注意这里要i <= j,因为最后要处理两个元素
if (A[i] * A[i] < A[j] * A[j]) {
result[k--] = A[j] * A[j];
j--;
}
else {
result[k--] = A[i] * A[i];
i++;
}
}
return result;
}
};
2.长度最小的子数组
题目:leetcode209
乍一看采用暴力求解方式,但是出现了超时的问题:`
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int results = INT32_MAX;
int sublenght = 0;
int sum = 0;
for(int i=0;i<nums.size();i++){
sum = 0;
for(int j=i;j<nums.size();j++){
sum +=nums[j];
if(sum>=target){
sublenght = j-i+1;
results = sublenght<results?sublenght:results;
break;
}
}
}
return results<INT32_MAX ? results : 0;
}
};
问题:
看了教程换了一种滑动窗口的思想:
核心点如下:
窗口内是什么?
如何移动窗口的起始位置?
如何移动窗口的结束位置?
窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。
窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。
窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int results = INT32_MAX;
int sublenght = 0;
int sum = 0,i = 0;
for(int j=0;j<nums.size();j++){
sum +=nums[j];
while(sum>=target){
sublenght = j-i+1;
results = sublenght<results?sublenght:results;
sum -= nums[i++];
}
}
return results<INT32_MAX ? results : 0;
}
};
3.螺旋矩阵
leetcode59
这道题难度较大一点,之前基本上是没有思路的,听了讲解之后理解了,附上讲解代码供参考:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> matrix(n, vector<int>(n, 0));
int startx = 0,starty = 0,offset=1,count =1;
int loop = n/2,i,j;
while(loop--){
i =startx,j=starty;
for(i=startx;i< n-offset;i++){
matrix[startx][i] = count++;
}
for(j= starty;j<n-offset;j++){
matrix[j][i] = count++;
}
for(; i > startx;i--){
matrix[j][i] = count++;
}
for(;j > starty;j--){
matrix[j][i] = count++;
}
offset++;
startx++;
starty++;
}
if (n % 2) {
matrix[n/2][n/2] = count;
}
return matrix;
}
};