刷题(双指针思想/滑动窗口思想/l螺旋矩阵)

这篇具有很好参考价值的文章主要介绍了刷题(双指针思想/滑动窗口思想/l螺旋矩阵)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DAY2

944 有序数组的平方

刚开始自己做就是无脑ac的,sort:
但是时间复杂度有问题, 是O(nlogn)的时间复杂度

class Solution {
    public int[] sortedSquares(int[] nums) {
        for(int i=0;i<nums.length;i++){
            nums[i] =nums[i]*nums[i];
        }
        Arrays.sort(nums);      
        return nums;
    }
}

提升:用双指针的思想:时间复杂度为O(n)

使用双指针的思想解决本题的思路:
以数组 为例:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
因为输入的数组是递增的,因此,平方后的最大值,只有可能在最左侧和最右端出现:

定义
1 定义一个新数组result,和nums数组一样的大小
2 定义两个指针: left 指向起始位置,right指向终止位置。
3 定义一个index指针:让index指向result数组终止位置,用index来向新数组存放数据: 依次从新数组的后面向前存数据,存的数据是旧数组中比较得来的较大的值;这样就可以保证新数组中依次存放的是(旧数组中数据平方后的增序排序了)。

class Solution {
    public int[] sortedSquares(int[] nums) {

        int[] res  = new int[nums.length];//新数组;

        int left =0;
        int right=nums.length-1;

        int index = nums.length-1;

        while(left<=right){
           if(nums[left]*nums[left]<=nums[right]*nums[right]){
               res[index] =  nums[right]*nums[right];
               index--;
               right--;
           }else{
               res[index] =  nums[left]*nums[left];
               index--;
               left++;
           }
        }
        return res;
    }
}

注意点:
写代码的时候要注意while(left<=right)这个条件,只要left<=right的时候,我们就要一直循环比较下去:因为如果是left==right的时候就退出来不进行while循环了,就会将这个元素落下来,但是实际上我们是仍然要更新这个值放在新数组中的,要保证数组的完整性,因此不可以用left<=right这个条件;还有一个if(...<=....)等于号的问题,其实写不写都行,因为else后面其实就包含了等于的情况,更新的话也是更新哪个都可以的;

209 长度最小的子数组

题目描述:
给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

示例:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

思路:
用双指针+滑动窗口的思想

滑动窗口:
其实就是满足我们条件的所有子数组连续的子数组
双指针 :
// 定义左边界:当找到一个的时候,就要缩小滑动窗口
// 定义右边界:主要就是负责寻找子数组的

滑动窗口的思想:

窗口就是 满足其和 ≥ target 的长度最小的连续子数组。
窗口的起始位置的移动:一旦当前窗口的值大于target了(count >= target),就要缩小滑动窗口,也就是左指针++。
窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        // 滑动窗口:其实就是满足我们条件的所有子数组连续的子数组
        // 定义左边界:当找到一个的时候 就要缩小滑动窗口
        // 定义右边界:主要就是负责寻找子数组的
        int left=0;
       // int right;

        //定义数组长度 以及更新最小子数组的长度!
        int  length=0;
        int  minLength=0;

        //定义累计计数
       int count=0;

        // 用右指针遍历数组
        for(int right=0;right<nums.length;right++){
             count = count + nums[right];// 根据题意进行数据的累加
            // 注意这里不能用if  要用while 因为要在数组中不断的寻找最小
            // 一旦大于target就要缩小窗口 即移动左指针
            while(count >= target){ 
                length = right - left + 1;
                // 注意一定有这个 因为如果第一个数就比target大呢 这时候minLength为0
                // 当前的长度比最小的长度还小 更新最小长度
                if(length < minLength ||minLength ==0 ){
                    minLength = length;
                }
                // 缩小滑动窗口: count缩小 left右移动
                count = count - nums[left];
                left++; 
            }
        }
        return minLength;        
    }
}

59 螺旋矩阵

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

处理的边界条件是不同的
坚持一个规则来处理每一条边
用左必右开的左

代码:文章来源地址https://www.toymoban.com/news/detail-402970.html

class Solution {

    public int[][] generateMatrix(int n) {
        // 模拟题.
        int loop = 0;  // 控制循环次数
        int[][] res = new int[n][n];//遍历的结果数组
        int start = 0;  // 每次循环的开始点(start, start)
        int count = 1;  // 定义填充数字 从1 开始
        int i, j; // j 是遍历行的 i是遍历列的

        while (loop++ < n / 2) { // 判断边界后,loop从1开始
            // 模拟上侧从左到右
            for (j = start; j < n - loop; j++) {
                res[start][j] = count++;
            }

            // 模拟右侧从上到下
            for (i = start; i < n - loop; i++) {
                res[i][j] = count++;
            }

            // 模拟下侧从右到左 j不用初始化了
            for (; j >= loop; j--) {
                res[i][j] = count++;
            }

            // 模拟左侧从下到上
            for (; i >= loop; i--) {
                res[i][j] = count++;
            }
            start++;
        }

        if (n % 2 == 1) {
            res[start][start] = count;
        }

        return res;
    }
}

到了这里,关于刷题(双指针思想/滑动窗口思想/l螺旋矩阵)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【剑指offer刷题记录 java版】数组双指针 之 滑动窗口

    本系列文章记录labuladong的算法小抄中剑指offer题目 题目链接:https://leetcode.cn/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/ 题目链接:https://leetcode.cn/problems/MPnaiL/ 题目链接:https://leetcode.cn/problems/VabMRr/ 题目链接:https://leetcode.cn/problems/wtcaE1/ 题目链接:https://leetcode.cn/pr

    2024年02月09日
    浏览(51)
  • 算法刷题营【Day2】:: 双指针算法应用:滑动窗口 :209. 长度最小的子数组

    本内容是笔者结合《代码随想录》总结所得,记录学习过程,分享知识! 目录: 1. 开篇例题:209. 长度最小的子数组 2. 题解参考 - - 2.1 方法一:暴力法 - - 2.2 方法二:滑动窗口 3. 方法思路点拨:滑动窗口 - - 3.1 直白解释 - - 3.2 本题思路点拨 4. 相关题集 1. 开篇例题:209. 长度

    2024年02月04日
    浏览(47)
  • 【练习】滑动窗口思想

    🎥 个人主页:Dikz12 🔥个人专栏:Java算法 📕格言:那些在暗处执拗生长的花,终有一日会馥郁传香 欢迎大家👍点赞✍评论⭐收藏 目录 1.长度最小的子数组 题目解析  讲解   代码实现  2.无重复字符的最长子串 题目解析   讲解 代码实现  3.最大连续1的个数 III 题目解析

    2024年04月08日
    浏览(62)
  • 算法训练第二天|977.有序数组的平方、209.长度最小的有序数组、59.螺旋矩阵2

    题目链接:力扣 思路:同样使用双指针的方法,这样就可以只遍历一次原数组。 可以考虑需要按照一个顺序来遍历,那就是从大到小或者从小到大,我选择的是从大到小。 不难看出,原数组将每个数平方后,呈现从两边到中间逐渐减小的规律。 所以使用一个指针指向原数组

    2023年04月22日
    浏览(57)
  • 有序数组的平方 长度最小的子数组 螺旋矩阵II

    977. 有序数组的平方 - 力扣(LeetCode) 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100] 示例

    2024年02月12日
    浏览(45)
  • 算法-有序数组的平方,长度最小的子数组,螺旋矩阵II

    伪装成一个老手! 题目 给你一个按 非递减顺序 排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。 示例 : 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100] 来源:力扣977 思路 遍

    2024年02月11日
    浏览(43)
  • 算法刷题-数组-螺旋矩阵

    力扣题目链接 给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 这道题目可以说在面试中出现频率较高的题目, 本题并不涉及到什么算法,就是模拟过程,但却十分考察对代

    2024年02月08日
    浏览(55)
  • 代码随想录【数组】----->有序数组的平方、长度最小的子数组、螺旋矩阵

    题目LeetCode977. 有序数组的平方 由于平方后 两边的元素最大,中间的元素最小 ,所以可以使用双指针。 定义left指向原数组最左边,right指向原数组最右边 比较left元素的平方和right元素的平方 left元素平方大于right元素平方,将left元素平方放在结果集最后,left++ right元素平方

    2023年04月27日
    浏览(82)
  • LeetCode刷题系列 -- 54. 螺旋矩阵

    给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入: matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出: [1,2,3,6,9,8,7,4,5] 示例 2: 输入: matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出: [1,2,3,4,8,12,11,10,9,5,6,7] 提示: m == matrix.length n == matrix[i].length 1 =

    2023年04月08日
    浏览(61)
  • 有序数组的平方、长度最小的子数组、螺旋矩阵II(Day2)

    题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/ 第一反应暴力如上代码 下面写一段用双指针思想的代码 题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/ 本题暴力解法会超时,以下采用滑动窗口的方式(将暴力的两个for循环变成一个) 题目链接:https://leetcode.cn/

    2023年04月26日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包