首页 > 编程语言 >代码随想录算法训练营第2天 | 数组滑动窗口、螺旋打印

代码随想录算法训练营第2天 | 数组滑动窗口、螺旋打印

时间:2024-07-04 16:24:28浏览次数:18  
标签:cur nums int res 训练营 随想录 else a2 滑动

有序数组的平方。常规方法复习冒泡排序,也可以使用双指针。因为有序数组的平方,最大值一定在两侧,最小值在中间。可以两侧往中间收拢。

2024年7月4日笔记:双指针法,两侧往中间逼近一定是从大到小,然后给res数组倒着填即可实现从小到大。

题977. 有序数组的平方

class Solution {
    public int[] sortedSquares(int[] nums) {
        int len = nums.length;
        int[] res = new int[len];
        int l=0,r=len-1;
        int cnt=len-1;
        while(l<=r){
            //看l大还是r大,谁大就先填谁然后向内移动一格
            if(abs(nums[l])>abs(nums[r])){
                res[cnt] = nums[l]*nums[l];
                cnt-=1;
                l+=1;
            }else{
                res[cnt] = nums[r]*nums[r];
                cnt-=1;
                r-=1;
            }
        }
        return res;
    }

    public int abs(int x){
        if(x<0){
            return -x;
        }else{
            return x;
        }
    }
}

长度最小的子数组,重点复习滑动窗口。
始终维护sum等于l和r之间所有值的和,然后不断和target比较,如果大了l就进,如果小了r就进,每次记录长度,最后就可以获得满足要求的最小长度。

题209. 长度最小的子数组

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int minLen=nums.length+1;
        int l=0,r=0;//左闭右闭
        int sum=nums[0];
        while(r<nums.length){
            if(sum>=target){
                if(minLen>r-l+1){
                    minLen = r-l+1;
                }
                l+=1;
                sum-=nums[l-1];
            }else{
                r+=1;
                if(r<nums.length){
                    sum+=nums[r];
                }
            }
        }
        if(minLen==nums.length+1){
            return 0;
        }
        return minLen; 
    }
}

螺旋矩阵
单独定义好边界,每轮过后更新边界,然后使用方向标记来记录当前的行进方向。

注意

  • x和y对应的行和列不要混淆;
  • 上边界初始化时即可设置为1,其他边界初始化为0。

题59. 螺旋矩阵 II

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] res = new int[n][n];
        int cur = 1;//右下左上分别用1234代表,一开始是右侧
        int x=0,y=0;//右正下正
        int a1=n-1,a2=n-1,a3=0,a4=1;//代表初始边界
        for(int i=1;i<=n*n;i++){
            res[x][y]=i;
            //如果当前是右侧,那么下一步只能右或者下
            //右侧和下侧边界都是最多n-1
            if(cur==1){
                if(y+1>a1){
                    cur=2;
                    x+=1;
                    //更新右侧边界
                    a1-=1;
                }else{
                    y+=1;
                }
            }else if(cur==2){
                if(x+1>a2){
                    cur=3;
                    y-=1;
                    //更新下侧边界
                    a2-=1;
                }else{
                    x+=1;
                }
            }else if(cur==3){
                if(y-1<a3){
                    cur=4;
                    x-=1;
                    //更新左侧边界
                    a3+=1;
                }else{
                    y-=1;
                }
            }else{
                if(x-1<a4){
                    cur=1;
                    y+=1;
                    //更新上侧边界
                    a4+=1;
                }else{
                    x-=1;
                }
            }
        }
        return res;
    }
}

题54. 螺旋矩阵

class Solution {
    public static List<Integer> spiralOrder(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        List<Integer> list1 = new ArrayList<>();
        int cur = 1;
        int a1=n-1,a2=m-1,a3=0,a4=1;//右下左上的起始边界
        int x=0,y=0;
        for(int i=0;i<m*n;i++){
            list1.add(matrix[x][y]);
            if(cur==1){
                if(y+1>a1){
                    cur=2;
                    x+=1;
                    a1-=1;
                }else{
                    y+=1;
                }
            }else if(cur==2){
                if(x+1>a2){
                    a2-=1;
                    cur=3;
                    y-=1;
                }else{
                    x+=1;
                }
            }else if(cur==3){
                if(y-1<a3){
                    a3+=1;
                    cur=4;
                    x-=1;
                }else{
                    y-=1;
                }
            }else{
                if(x-1<a4){
                    a4+=1;
                    cur=1;
                    y+=1;
                }else{
                    x-=1;
                }
            }
        }
        return list1;
    }
}

标签:cur,nums,int,res,训练营,随想录,else,a2,滑动
From: https://www.cnblogs.com/hailicy/p/18284069

相关文章

  • LeetCode-刷题记录-滑动窗口合集(本篇blog会持续更新哦~)
    一、滑动窗口概述滑动窗口(SlidingWindow)是一种用于解决数组(或字符串)中子数组(或子串)问题的有效算法。SlidingWindow核心思想:滑动窗口技术的基本思想是维护一个窗口(一般是一个子数组或子串),该窗口在数组上滑动,并在滑动过程中更新窗口的内容。通过滑动窗口,可以在(O(......
  • 代码随想录算法训练营第四十八天 | 188.买卖股票的最佳时机IV 309.买卖股票的最佳时
    188.买卖股票的最佳时机IV题目链接文章讲解视频讲解动规五部曲:dp数组的含义:dp[j][2*i-1]表示第i次持有股票dp[j][2*i]表示第i次不持有股票递推公式:dp[j][2i-1]=max(dp[j-1][2i-1],dp[j-1][2*i-2]-prices[j]);dp[j][2i]=max(dp[j-1][2i],dp[j-1][2*i-1]......
  • 代码随想录第四十六天 | 322. 零钱兑换,279.完全平方数,139.单词拆分
    322.零钱兑换看完想法:此处是求最小值,所以递推公式中含Min,即dp[j]=min(d[[j],dp[j-coins[i]]+1),初始化都为INT_MAX,且dp[0] =0。由于不是求组合数,所以物品和背包重量的遍历先后顺序都是可以的。此处要注意一个细节,如果是物品for外循环,背包从coins[j]开始并且j++,(之......
  • 代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素
    704.二分查找这个之前有写过,最重要的就是把握住要去搜索的区间的形式,包括左闭右闭以及左闭右开两种classSolution{publicintsearch(int[]nums,inttarget){intleft=0,right=nums.length;while(left<right){//左闭右开的版本,结果存储......
  • 代码训练营 DAY4打卡
      本文由GarfieldTheOldCat原创,转载请标明dekkyandlappy-CSDN博客今天学习了链表的第二课时,链表基础内容在代码训练营DAY3打卡 本文由GarfieldTheOldCat原创,转载请标明两两交换链表中的节点这道题目的第一个难点在于对题目意思的理解,什么是两两交换?举个例子:【A,B,C,D】......
  • 代码随想录算法训练营第四十六天 | 买卖股票的最佳时机
    121.买卖股票的最佳时机题目链接文章讲解视频讲解动规五部曲:dp[j][0]:表示持有股票的最大现金,dp[j][1]表示不持有股票的最大现金递推公式:第j天持有股票的最大现金为:之前就持有这只股票和今天持有这只股票取最大值:dp[j][0]=max(dp[j-1][0],-prices[j]);第j天不持有......
  • 代码随想录算法训练营第四十五天 | 打家劫舍
    198.打家劫舍题目链接文章讲解视频讲解dp[j]:表示投到第j家最多能偷dp[j]的钱递推公式:dp[j]=max(dp[j-2]+nums[j],dp[j-1])初始化:dp[0]=nums[0],dp[1]=max(dp[0],dp[1])遍历顺序:从小到大打印dp数组classSolution{public:introb(vector<int>&n......
  • 代码随想录算法训练营第四十四天 | 322.零钱兑换 279.完全平方数 139.单词拆分
    322.零钱兑换题目链接文章讲解视频讲解classSolution{public:intcoinChange(vector<int>&coins,intamount){//dp[j]:表示能凑成面额j所需的最少硬币个数vector<int>dp(amount+1,0);//递推公式:dp[j]=min(dp[j-coins[i]......
  • wpf关于Resource,Style的定义与引用,滑动按钮
    当我们使用wpf框架去搭建自己的程序时,一般都会重写wpf原生的一些样式,以达到软件风格的统一于美化,以下介绍一下常见的几种添加Style的方式我们以一个滑动按钮为例1.对当前控件的样式进行更改<ToggleButton><ToggleButton.Style><StyleTarg......
  • 单调队列(滑动窗口)
    154.滑动窗口-AcWing题库单调队列和单调栈就是在暴力的基础上进行优化,把永远用不到的元素删除。简而言之  就是比你好而且还在你后面的数你永远无法超越他。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineendl'\n'constintN=5e5+......