【代码随想录】day2| 力扣 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

文章介绍了如何使用双指针算法和C++容器sort方法来处理有序数组的平方问题,同时提供了解决长度最小子数组问题的滑动窗口思路。还讨论了生成螺旋矩阵的技巧。
摘要由CSDN通过智能技术生成

目录

  • 复习用tip
  • 997. 有序数组的平方
    • **思路1(双指针)**
    • **思路2:利用容器sort方法排序**
  • 209. 长度最小的子数组
  • 59. 螺旋矩阵 II

复习用tip

1、总是忘记的,vector初始化设置大小用"()",不是用"[]"!
这里不需要对size的强制类型转换,

vector<int>vec(2);//size为2的vector变量
vector<int>vec[2];//两个size为0的vector数组

2、用于记录类型最大/最小值的宏常量,存在于<limits.h>中

#define MB_LEN_MAX  5//获取多字节字符中的最大字节数
#define SHRT_MIN    (-32768)//short
#define SHRT_MAX    32767
#define USHRT_MAX   0xffff//unsigned short
#define INT_MIN     (-2147483647 - 1)//int
#define INT_MAX     2147483647
#define UINT_MAX    0xffffffff//unsigned int
#define LONG_MIN    (-2147483647L - 1)//long
#define LONG_MAX    2147483647L
#define ULONG_MAX   0xffffffffUL//unsigned long
#define LLONG_MAX   9223372036854775807i64//long long
#define LLONG_MIN   (-9223372036854775807i64 - 1)
#define ULLONG_MAX  0xffffffffffffffffui64//unsigned long long

997. 有序数组的平方

题目链接

给你一个按 非递减顺序 排序的整数数组 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 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 已按 非递减顺序 排序

思路1(双指针)

利用双指针,从两侧向中间(绝对值由大到小) 进行摆放

vector<int> sortedSquares(vector<int>& nums) { 
        vector<int>ans(nums.size());       
        int high=nums.size()-1,low=0;
        for(int i=high;i>=0;i--){
            int h=nums[high]*nums[high],l=nums[low]*nums[low];
            if(h>l){
                ans[i]=h;
                high--;
            }else{
                ans[i]=l;
                low++;
            }            
        }
        return ans;
    }

思路2:利用容器sort方法排序

简单粗暴的先平方、在排序。但是思考空间较小,练习时尽量不用。

vector<int> sortedSquares(vector<int>& nums) {
        vector<int> ans;
        for (int num: nums) {
            ans.push_back(num * num);
        }
        sort(ans.begin(), ans.end());
        return ans;
    }

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

int minSubArrayLen(int target, vector<int>& nums) {
	size_t n = nums.size();
	int left = 0, right = 0;//滑动窗口的左右两边
	int sum{ 0 };//当前滑动窗口内数的总和,随着窗口变动而变动
	int len{ INT_MAX };//当前符合条件的滑动窗口,默认最大长度,找最小的
	for (right = 0; right < n; right++) {//窗口右侧一直动,当等于/超过target时,左侧才动
		sum += nums[right];
		/*if (sum < target) {//若小于,滑动窗口不够长,右边继续延伸
			continue;
		}*/
		while (sum >= target) {//若大于等于,寻找最小的窗口
			len = min(len, right - left + 1);
			sum -= nums[left];
			left++;
		}
	}
	return len == INT_MAX ? 0 : len;

}

59. 螺旋矩阵 II

题目链接
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:
输入: 3
输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
在这里插入图片描述

思路:确认好每次循环的起始点和终点,按顺序填充即可。
难点在于把握统一的区间,这里采用左闭右开
借用卡哥这张图,一目了然
在这里插入图片描述

vector<vector<int>> generateMatrix(int n) {
	vector<vector<int>> ans(n, vector<int>(n, 0)); // 二维数组定义
	int start_x{ 0 }, start_y{ 0 };//每次循环的开始
	int loop{ n / 2 };//4个边遍历的循环次数
	int offset{ 1 };//每次遍历的【终点值】:n-1,n-2,n-3,...,控制边长度用
    //每次循环边遍历的长度:n-1,n-3,n-5...
	int num{ 1 };
	while (loop--) {
		//左闭右开: [l,r)
		int j{ start_y }, i{ start_x };
		//→
		for (; j < n - offset; j++) {
			ans[i][j] = num;
			num++;
		}
		//↓
		for (; i < n - offset; i++) {
			ans[i][j] = num;
			num++;
		}
		//←
		for (; j > start_y; j--) {
			ans[i][j] = num;
			num++;
		}
		//↑
		for (; i > start_x; i--) {
			ans[i][j] = num;
			num++;
		}
		offset++;
		start_x++;
		start_y++;

	}
	if (n % 2) ans[n / 2][n / 2] = num;
	return ans;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值