Day2.大一小白leetcode59,209,977

先简单后难的看
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;
    }
};

本题来自代码随想录,建议观看卡神
小白先溜了!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值