先简单后难的看
977
如题
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
示例 2:
输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]
1.)最简单的for遍历平方,然后用算法库中的sort函数直接排。
2.)采用双指针(意思双下标法)
我们知道 非递减顺序 排序的整数数组 平方值从两边向中间递减。
我们定义一个指针 left,一个指针 right,比值大小交换。
代码如下
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int len = nums.size() - 1;// 看下文for循环就知道了为什么定义这个len,新数组下表。
vector<int> Newnums(nums.size(),0);// 定义新数组
for(int left=0,right=len;left<=right;)//len能体现了
{
if(nums[left]*nums[left]<nums[right]*nums[right])//看下文
{
Newnums[len]=nums[right]*nums[right];
len--;
right--;
}
else{
Newnums[len]=nums[left]*nums[left];
len--;
left++;
}
}
return Newnums;
}
};
if(nums[left]*nums[left]<nums[right]*nums[right])
如果left为下标的数小于right为下标的数,新数组下表len的位置填充大的数,然后原数组大的没有了,right减去1,开始比较新的以right为下表的值与left为下表的值比较。
相反,等于(等于返回谁都可以)或大于的情况用else就行。
然后循环(着重理解循环条件!and 题目数组的非递减顺序 排序的整数数组)
209
题目
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4]
输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0
简单来说,数组中连续的数和大于或等于target,记录这个数组的长度;
1.)可以双层for循环暴力求解
2.)看卡神代码后学习如下
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int val=INT32_MAX;//32bit最大值(也可以大于数组长度n+1),其实这个判断长度是否改变,不改变输出0(题要求
int sum=0;//求连续数组的和
int len=0;//记录长度
int j=0;//做指针(个人理解slow
for(int i=0;i<nums.size();i++)
{
sum+=nums[i];//求和中
while(sum>=target)//判断是否大于target是则记录连续子数组长度
{
1 len=i-j+1;//子数组长度(为什么减一数学知识,0到1 length=1-0+1=2
val=val>len?len:val;//第一次进一定改变,而后来进入循环的话,与后来满足条件的连续数组比较,然val=最小子数组长度
2 sum=sum-nums[j];//循环成功后让sum减去第一个数,缩减数组继续寻找
j++;//(slow 改变 然1,2两个满足
}
}
return val==INT32_MAX? 0 : val;//循环结束后,判断val是否改变 ,改变输出改变值,如不,输出0;
}
};
977
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
这题好头疼,想摆了,但是~~~~~~~·~~gg
代码如下
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> arr(n,vector<int>(n,0));//定义二位数组空间
int beginx=0,beginy=0;
int mid=n/2;//填充中间的数的坐标
int nd=1;//因为我们是这样处理的,如果第一行3个数,处理2个,最后的数留给下一次(也是处理2个数
int count=0;//填充的数
int round=n/2;//循环次数 3就是1次中间的数填充mid
int x,y;
while(round--)
{
for(x=beginx;x<n-nd;x++) arr[beginy][x]=++count;
for(y=beginy;y<n-nd;y++) arr[y][x]=++count;
for(;x>beginx;x--) arr[y][x]=++count;
for(;y>beginy;y--) arr[y][x]=++count;
beginx++;
beginy++;
nd++;
}
if(n%2==1) arr[mid][mid]=++count;//判断是否是奇数
return arr;
}
};
本题来自代码随想录,建议观看卡神
小白先溜了!!!