代码随想录算法训练营第三天|977.有序数组的平方 , 209.长度最小的子数组, 59.螺旋矩阵II

 977.有序数组的平方 

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思路:一、先把数组元素平方,然后再排序。排序的方法有冒泡法、调用sort()函数

二、双指针法。由于最大的数可能出现在数组的首和尾两个地方,所以可以用双指针法,慢指针指向最后的元素,快指针指向起始的位置,向中间靠拢。

知识点:在VS中,使用sort,

#include <algorithm>

sort(nums, nums+len); // 快速排序,升序,nums为数组,len为数组的长度

用到vector时,

#include <algorithm>//使用sort
#include <vector>//使用vector容器

vector<int>nums = { -4,-1,0,3,10 };

sort(nums.begin(), nums.end());//升序排序

 209.长度最小的子数组

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思路:采用滑动窗口的方法。什么是滑动窗口?其实就是双指针的方法。所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果

关键的点在于如何缩小区间。首先判断前i个元素之和是否大于target,如果满足条件,那么记录下此时窗口的大小len,然后缩小窗口的大小,也就是让和减一个元素,看看还满不满足前i-1个元素之和是否大于target

判决条件使用while(sum>target),因为while可以一直迭代下去,直到不满足条件

 59.螺旋矩阵II

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思路:1、要转多少圈?n个元素,假设n是偶数,n/2圈,假设n是奇数,n/2圈,还剩下一个n*n放数组最中间。

2、四条边怎么填?必须自己统一规定元素的选取边界,比如左闭右开。每一圈都按照下面的方法填充:

填充上行从左到右(左闭右开)

填充右列从上到下(左闭右开)

填充下行从右到左(左闭右开)

填充左列从下到上(左闭右开)

注意内圈,比如第2圈的时候,一行的元素是比第一圈要少的,所以要注意这个变量。

下面给一段vs的代码:

int main()
{
    int n = 4;
    cin >> n;
    vector<vector<int>>arr(n, vector<int>(n, 0));//创建一个二维数组
    /*for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << arr[i][j]<<" ";
        }
        cout << endl;
    }
    */
    
    int start = 0;
    int end = 0;
    int loop = n / 2;//圈数
    int mid = n / 2;//如果n是奇数,最后一个元素就是放最中间的位置
    int cout = 1;//用来计数,给矩阵赋值
    int offset = 1;//控制每一条边遍历的长度,每次循环右边界收缩一位
    int i, j;
    while (loop--)
    {
        i = start;
        j = end;
        for (; j< n-offset; j++)//模拟填充上行从左到右(左闭右开)
        {
            arr[i][j] = cout;
            cout++;
        }
        for (; i < n-offset; i++)//模拟填充右列从上到下(左闭右开)
        {
            arr[i][j] = cout;
            cout++;
        }
        for (; j > end; j--)//模拟填充下行从右到左(左闭右开)
        {
            arr[i][j] = cout;
            cout++;
        }
        for (; i > start; i--)//模拟填充左列从下到上(左闭右开)
        {
            arr[i][j] = cout;
            cout++;
        }
        start++;
        end++;
        offset++;
    }
    if (n % 2) 
    {
        arr[mid][mid] = cout;
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            std::cout << arr[i][j]<<"   ";
        }
        std::cout << endl;
    }
    system("pause");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值