写在前面:
慎独慎初慎微慎欲,自重自省自警自励。
977.答题过程
首先尝试暴力排序解法:
最直观的想法,莫过于:每个数平方之后,排个序。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for(int i=0;i<nums.size();i++){
nums[i]=nums[i]*nums[i];
}
sort(nums.begin(),nums.end());//注意这里sort括号里面的格式
return nums;//不能直接return sort... 需要return nums;
}
};
其中sort的用法学习:(37条消息) C++ sort函数用法_无火的残烬的博客-CSDN博客_c++sort函数用法
双指针排序:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> result(nums.size(), 0);//创建一个新的数组用来存放排序后的数,注意格式,result是名称,可以随便取
int k = nums.size() - 1;
for (int i = 0, j = nums.size() - 1; i <= j;) { // 注意这里要i <= j,因为最后当i=j时候,也要平方传到新数组里,注意这里for循环的用法(第二个分号后面)
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--;//这里k--可以移到for循环里面第二个分号后面,但是看着容易乱
}
return result;
}
};
206.答题过程
暴力解法:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result = INT32_MAX; // 最终的结果 INT32_MAX是一个很大的值
int sum = 0; // 子序列的数值之和
int subLength = 0; // 子序列的长度
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 >= target) { // 一旦发现子序列和超过了;target,更新result
subLength = j - i + 1; // 取子序列的长度
result = result < subLength ? result : subLength;//三目运算符
break; // 因为我们是找符合条件最短的子序列,所以一旦符合条件就break,注意:这个break只是第二个for循环结束了
}
}
}
// 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
return result == INT32_MAX ? 0 : result;
}
};
滑动窗口(双指针):
相当于用一个for循环,实现两个for循环的功能
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result=INT32_MAX;
int sum=0; // 滑动窗口数值之和
int length=0; // 滑动窗口长度
int i=0; //滑动窗口初始值
for(int j=0;j<nums.size();j++){//j是滑动窗口的终止位置
sum=sum+nums[j];
// 注意这里使用while,每次更新 i(起始位置),并不断比较子序列是否符合条件
while(sum>=target){
length=j-i+1;// 取子序列的长度
result=result<length?result:length; //result=min(length,result);这样写也可以
sum=sum-nums[i]; //这里改成num[i++],下面的i++删去也可以,需注意i++是先拿i去运算,再加1
i++; // 这里体现出滑动窗口的精髓之处,不断变更i(子序列的起始位置) 注意这里i++要放在sum运算的下面,不能放在上面。
}
}
// 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
return result==INT32_MAX?0:result;
}
};
59.答题过程
c++使用vector创建二维数组的方法:
//使用vector一次性完成二维数组的定义(注意:此种方法适用于每一行的列数相等的二维数组)
vector<vector<int>> matrix(m, vector<int>(n, -1));
//以下是拆分理解
//创建一维数组matirx,这个数组里有m个元素,元素是int型vector。
vector<vector<int>> matrix(m);//matrix是二维数组名称
//除了定义数组类型及数组大小外,同时给数组中的元素赋值:将元素赋值为大小为n的int型vector。
vector<vector<int>> matrix(m, vector<int>(n));//这里创建的是m行,n列的二维数组
//除了定义数组类型、数组大小、列的大小,同时给数组列中的元素(或者说,数组中的所有元素)赋值为-1。
vector<vector<int>> matrix(m, vector<int>(n, -1));
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n,vector<int>(n,0));// 使用vector定义一个二维数组,注意左行右列
int startx=0; //二维数组的行数
int starty=0; //二维数组的列数 定义每循环一个圈的起始位置
int loop=n/2; //每个圈循环几次,例如n为奇数3,那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理
int number=1; //初始化元素为1,用来给矩阵中每一个空格赋值
int offset=1; //设置的左闭右开,所以初始让边界减去的值为1
int i,j;
while(loop--){
i=startx;
j=starty;
for(j=starty;j<n-offset;j++){//注意,n是从1开始,但是j的位置是从0开始 这是第一个边界的赋值 这里还需要注意一个点,前面已经int了j,在此处的for循环中不能再int j 了,比如for(int j=starty;j<n-offset;j++) 就是错的
res[startx][j]=number;
number++;
}
for(i=startx;i<n-offset;i++){//这是第二个边界,第一个丨边界赋值
res[i][j]=number;
number++;
}
for(;j>starty;j--){
res[i][j]=number;
number++;
}
for(;i>startx;i--){
res[i][j]=number;
number++;
}
// 第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)
startx++;//进入到下一层的螺旋里,这些边界的初始值都要加一,包括边界减去的值setoff
starty++;
offset++;
}
if(n%2==1){//当n是奇数的时候,需要单独给矩阵最中间的位置赋值
res[n/2][n/2]=number;
}
return res;
}
};