977.有序数组的平方
classSolution{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;}};
209.长度最小的子数组
classSolution{public:intminSubArrayLen(int s, vector<int>& nums){int result = INT32_MAX;int sum =0;// 滑动窗口数值之和int i =0;// 滑动窗口起始位置int subLength =0;// 滑动窗口的长度for(int j =0; j < nums.size(); j++){
sum += nums[j];// 注意这里使用while,每次更新 i(起始位置),并不断比较子序列是否符合条件while(sum >= s){
subLength =(j - i +1);// 取子序列的长度
result = result < subLength ? result : subLength;
sum -= nums[i++];// 这里体现出滑动窗口的精髓之处,不断变更i(子序列的起始位置)}}// 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列return result == INT32_MAX ?0: result;}};
59.螺旋矩阵II
classSolution{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就是模拟转了一圈// 模拟填充上行从左到右(左闭右开)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++;}// 第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)
startx++;
starty++;// offset 控制每一圈里每一条边遍历的长度
offset +=1;}// 如果n为奇数的话,需要单独给矩阵最中间的位置赋值if(n %2){
res[mid][mid]= count;}return res;}};
感受:
写代码的过程中还存在细节方面的问题,有些函数没记住,导致写的过程比较慢,还得多练习
明天复习一下继续加油