首页 > 其他分享 >Day2 |977.有序数组的平方& 209.长度最小的子数组&59.螺旋矩阵II

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

时间:2024-07-04 23:53:46浏览次数:22  
标签:977 59 nums int res sum ++ length 数组

977.有序数组的平方

这题太简单了,中间的排序我用的选择排序

贴代码了

public int[] sortedSquares(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            nums[i] = nums[i]*nums[i];
        }
        for (int i = 0; i < nums.length; i++) {
            int min = i;
            for (int j = i+1; j < nums.length; j++) {
                if(nums[min]>nums[j]){
                    min = j;
                }
            }
            if(nums[min]!=nums[i]){
                int tmp = nums[i];
                nums[i] = nums[min];
                nums[min] = tmp;
            }
        }
        return nums;
    }

209.长度最小的子数组

思路 : 我刚开始想的解法就是双指针滑动解法,如果使用双指针滑动暴力解法最后在力扣里面会超时,但是自己测试没有问题

但是想通过力扣确实还需要优化成下面所谓的滑动窗口的解法.

@Test
    public void test2() {
        int[] nums = {2, 3, 1, 2, 4, 3};
        int target = 7;
        System.out.println(minSubArrayLen2(target, nums));
    }

    public int minSubArrayLen(int target, int[] nums) {//双指针暴力解法
        int sum;
        int res = Integer.MAX_VALUE;
        if (target == 0) {
            return 0;
        }

        for (int i = 0; i < nums.length; i++) {
            sum = 0;
            for (int j = i; j < nums.length; j++) {
                sum += nums[j];
                if (sum >= target) {
                    if (res > j - i + 1) {
                        res = j - i + 1;
                        break;
                    }
                }
            }
        }
        if (res == Integer.MAX_VALUE) return 0;
        return res;
    }

    public int minSubArrayLen2(int target, int[] nums) {//比较简洁的解法,也就是所谓的滑动窗口解法
        int left = 0;
        int right = 0;
        int res = Integer.MAX_VALUE;
        int sum = nums[0];

        while (true) {
            if (sum >= target) {
                if (res > right - left + 1) {
                    res = right - left + 1;
                }
                sum -= nums[left];
                left++;

            } else {
                right++;
                if (right >= nums.length) {
                    if (res == Integer.MAX_VALUE) return 0;
                    else return res;
                }
                sum += nums[right];

            }
        }

59.螺旋矩阵II

这题我之前做过对角线矩阵和旋转矩阵,我一般的思路都是直接模拟矩阵,然后把矩阵构造出来

至于这种方式在之后的矩阵题目中可不可行,还有待验证.

	@Test
    public void test3() {
        int n = 4;
        int[][] res = generateMatrix(n);
        for (int i = 0; i < res.length; i++) {
            for (int j = 0; j < res.length; j++) {
                System.out.print(res[i][j] + "\t");
            }
            System.out.println();
        }
    }

    public int[][] generateMatrix(int n) {
        int[][] matrix = new int[n][n];

        int num = 1;
        int l = 0;
        int r = n - 1;
        int t = 0;
        int b = n - 1;
        while (num <= n * n) {
            for (int i = l; i <= r; i++) {// 从左向右
                matrix[t][i] = num;
                num++;
            }
            t++;
            for (int i = t; i <= b; i++) { // 从上到下
                matrix[i][r] = num;
                num++;
            }
            r--;
            for (int i = r; i >= l; i--) { //从右到左
                matrix[b][i] = num;
                num++;
            }
            b--;
            for (int i = b; i >= t; i--) { // 从下到上
                matrix[i][l] = num;
                num++;
            }
            l++;
        }
        return matrix;

    }

小插曲 关于动态规划

动态规划今天有些顿悟,但还需要验证自己的想法

猜想 :

  1. 动态规划是通过转移方程体现动态的

  2. 动态规划是通过计算所有情况的状态,存入数组,来实现对某一状态的快速查找

  3. 动态规划中很多状态的重复转移导致我们可以把这类情况总结为一个状态转移方程

  4. 一般可以写成动态规划的题都有一部分可以使用递归的特征

  5. 动态规划有一些状态不在可重复转移的过程中,因此状态转移方程才出现常见的解题思路中的边界条件,其实边界条件理解为另外的状态转移方程比较好.

  6. 状态转移方程分为两个:

    • 一般情况下的状态转移方程
    • 边界情况下的状态转移方程
  7. 关于使用动态规划思维的题的返回值,通常是状态转移的目标结果.

以上均为我的猜想,目前还没有验证猜想,等后续更新吧.

标签:977,59,nums,int,res,sum,++,length,数组
From: https://www.cnblogs.com/flydandelion/p/18284919

相关文章

  • 【34. 在排序数组中查找元素的第一个和最后一个位置】
    题目:给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1,-1]。你必须设计并实现时间复杂度为O(logn)的算法解决此问题。示例1:输入:nums=[5,7,7,8,8,10],t......
  • 代码随想录刷题day 2 | 977.有序数组的平方、 209.长度最小的子数组、 59.螺旋矩阵II
    977.有序数组的平方classSolution{publicint[]sortedSquares(int[]nums){int[]ans=newint[nums.length];intleft=0,right=nums.length-1;for(inti=nums.length-1;i>=0;i--){if(nums[right]*nums[righ......
  • 数据库MyBatis传递数组或集合
    应用场景假设你有两个表,一个是商品信息表(表1,例如商品类别信息),另一个是库存信息表(表2,记录每种商品的库存数量)。你想知道特定几个商品类别(通过其ID标识,这里是1、2、3)的所有商品的总库存量。这个查询就会非常有用,它不仅能够跨表根据商品类别ID筛选出相关商品,还能计算出这些商......
  • 指针数组与数组指针(超详细!!!)
    指针数组秘诀:括号优先,先右后左,由近及远        指针数组是一个数组,其中每个元素都是一个指针。指针数组可以用于存储指向不同数据类型的指针,例如字符、整数或结构体等。int*p[n];//定义了一个指针数组,数组大小为n,数组中的每个元素都是一个int*指针 存储指向整......
  • 「代码随想录算法训练营」第二天 | 数组 part2
    977.有序数组的平方题目建议:本题关键在于理解双指针思想题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/题目难度:简单文章讲解:https://programmercarl.com/0977.有序数组的平方.html视频讲解:https://www.bilibili.com/video/BV1QB4y1D7ep题目状态:通过......
  • Java 中Json中既有对象又有数组的参数 如何转化成对象
    1.示例一:解析一个既包含对象又包含数组的JSON字符串,并将其转换为Java对象在Java中处理JSON数据,尤其是当JSON结构中既包含对象又包含数组时,常用的库有org.json、Gson和Jackson。这里我将以Gson为例来展示如何解析一个既包含对象又包含数组的JSON字符串,并将其转换为Java对象。首先......
  • 代码随想录算法训练营第九天|151.反转字符串中的单词、55.右旋字符串、28.找出字符串
    151以前写过很呆的写法但能用嘿1classSolution{2public:3stringreverseWords(strings){4//初始化变量5vector<vector<int>>data;//存储单词的起始地址和长度6stringans;//最终结果字符串7intnum=0;......
  • 代码随想录算法训练营第2天 | 数组滑动窗口、螺旋打印
    有序数组的平方。常规方法复习冒泡排序,也可以使用双指针。因为有序数组的平方,最大值一定在两侧,最小值在中间。可以两侧往中间收拢。2024年7月4日笔记:双指针法,两侧往中间逼近一定是从大到小,然后给res数组倒着填即可实现从小到大。题977.有序数组的平方classSolution{pub......
  • 【淘宝&天猫】原创高阶技术第59期,无界终极优化
    电子商务平台优化技术研究摘要:本文系统地介绍了电子商务平台优化技术,特别是针对淘宝和天猫平台的高阶技术策略。通过一系列课程内容的分析,本文旨在为电子商务从业者提供深入的优化方法和案例研究。关键词:电子商务优化,淘宝,天猫,拼多多,抖音,搜索优化1.引言随着电子商务的快......
  • 让数组倒叙
    1.使用reverse()函数vararray=['我','喜','欢','你'];array.reverse();//输出:["你","欢","喜","我"]2.循环遍历一一使其倒序vararray=['我','喜','欢','你'];va......