Day02 数组

68 阅读2分钟

977 有序数组的平方

leetcode题目

代码随想录文章

题目描述

给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。

思路

  1. 先将数组内数字平方,再使用快速排序进行排序。
  2. 新建一个vector数组result,用两个指针分别指向数组nums首尾,比较首尾指针指向数字的平方大小,将较大的数字平方加入到result尾部,最终返回result。

代码实现(双指针)

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int length = nums.size();
        vector<int> result(length,0);
        int k = length - 1;
        for(int i = 0, j = length - 1; i <= j;){
            if(nums[i] * nums[i] > nums[j] * nums[j]){
                result[k--] = nums[i] * nums[i];
                i++;
            }
            else{
                result[k--] = nums[j] * nums[j];
                j--;
            }
        }
        return result;
    }
};

209 长度最小的子数组

leetcode题目

代码随想录文章

题目描述

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的连续子数组[numsl,numsl+1,...,numsr1,numsr][nums_l,nums_{l+1},...,nums_{r-1},nums_r]并返回其长度。如果不存在符合条件的子数组,返回0。

思路

滚动窗口思想,设置两个指针,分别指向窗口的首尾,尾部指针从头到尾进行遍历,当头尾指针中间数字和大于等于target时,记录头尾之间的长度,头指针后移,选取头尾之间长度最小值,返回头尾指针中间数字组成的新数组长度。

代码实现(滚动窗口)

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int res = nums.size()+1;//新数组长度初始化为一个大值
	int sum = 0, i = 0, length = 0;
	for(int j = 0; j < nums.size(); j++){
		sum += nums[j];
		while(sum >= target){
                    //当出现符合条件的子数组时,记录长度
			length = j - i + 1;
			res = min(length,res);
			sum -= nums[i];//移除首数字,进行下一次循环的比较,找出最小长度
			i++;
		}
	}
        //如果res的值没有发生改变,说明不存在符合条件的子数组,返回0
        if(res == nums.size() + 1)
            return 0;
	return res;
    }
};

时间复杂度O(n);空间复杂度O(1)。

59 螺旋矩阵Ⅱ

leetcode题目 代码随想录文章

题目描述

给你一个正整数n ,生成一个包含1到n2所有元素,且元素按顺时针顺序螺旋排列的n x n正方形矩阵matrix。

思路

明确数组螺旋时的边界处理即可。

代码实现

class Solution{
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> nums(n, vector<int>(n,0));//定义一个二维数组
        int startx = 0, starty = 0;
        int count = 1;
        int i, j;
        int loop = n / 2;
        int mid = n / 2;//中心元素位置坐标
        int m = n;
        
        while(loop){
            //上左下右四条边依次遍历赋值
            for(j = starty; j < m - 1; j++)
                nums[startx][j] = count++;
            for(i = startx; i < m - 1; i++)
                nums[i][j] = count++;
            for(; j > starty; j--)
                nums[i][j] = count++;
            for(; i > startx; i--)
                nums[i][j] = count++;
            startx++;
            starty++;
            loop--;
            m--;
        }
        if(n % 2)
            nums[mid][mid] = count;//如果n是奇数,中心元素的值为count
        return nums;
    }
};

今天补上了昨天的。。