Day2 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结

Day2 :

有序数组的平方:

977. 有序数组的平方 - 力扣(LeetCode)

第一种暴力解法:

将数组中元素先平方再进行排序。这样时间复杂度为nlogn。

class Solution
{
	int sortedSquares(vector<int>& nums)
    {
        for(int i=0;i<nums.size(),i++)
        {
            nums[i] = nums[i]*nums[i];
		}
        sort(nums.begin(),nums.end());//默认为升序排列
        return nums;
	}
};

第二种解法:双指针解法:

主要思想是因为数组中肯定包含的有负数,所以需要分别从数组的两头进行取值,由于是升序排列所以需要

新数组的新下标要从数组的最后一个进行。

img

class Solution
{
 	int sortedSquare(vector<int>& nums)
    {
        int k = nums.size()-1;//定义新数组的下标
        int i = 0;
        int j=nums.size()-1;
        vector<int> result(nums.size());
        for(i,j;i<=j;)
        {
            if(nums[i]*nums[i]>nums[j]*nums[j])
            {
                result[k] = nums[i]*nums[i];
                k--;
                i++;
			}
           	else
            {
                result[k] = nums[j]*nums[j];
                k--;
			}
		}
        return reslut;
	}
};

209. 长度最小的子数组

暴力解法:步思想是找到所有的子区间两个for循环解决问题。


双指针即滑动窗口解决长度最小的子数组:

class Solution
{
    int minSubArrayLen(int target,vector<int>&nums)
    {
        int i=0;
        int j=0;//定义滑动窗口的末位置
        int result =nums.size()+1;//自己定义一个合适的初始值最后再筛选一下
        int sum=0;//定义求和值
        for(int j=0;j<nums.size();j++)//末尾值进行遍历
        {
            sum +=nums[j];//求和值
            while(sum>=target)//寻找大于等于目标值的最小子数组
            {
                minSubarrL = j-i+1;//计算子数组长度
                result = min(result,minsubarrL);//取最小值
                i++;//向后遍历找最小子数组
			}
		}
        if(result<=nums.size())//最后再筛选一下
        {
            return result;
		}
        else
        {
            return 0;
		}
	}
};

核心思想:

终止位置的选择和初始位置是怎么进行选择的才能达到选择到最小子数组的目的。

59. 螺旋矩阵 II

这个题目多注意边界处理即可参考二分法

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        int loop = n/2;
        int startx = 0;//起始行位置
        int starty = 0;//起始列位置
        int count = 1;//计数处理进行填充
        int offset=1;//先处理边界值
        vector<vector<int>> matrix(n,vector<int>(n, 0));
        int i=0;
        int j=0;
        while(loop--)
        {
            i = startx;
            j = starty;
            for(j;j<n-offset;j++)//int a[i][j]先处理列;
                {
                    matrix[startx][j]=count;
                    count++;
                }
            for(i;i<n-offset;i++)
                {
                    matrix[i][j]=count;
                    count++;
                }
            for(j;j>startx;j--)
                {
                    matrix[i][j]=count;
                    count++;
                }
            for(i;i>starty;i--)
                {
                    matrix[i][j]=count;
                    count++;
                }
            startx++;
            starty++;
            offset++;
            
        }
        if(n%2)
            {
                matrix[n/2][n/2]=count;
            } 
        return matrix;    
    }
};

数组理论总结:

img

  • 22
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值