代码随想录day02

这篇具有很好参考价值的文章主要介绍了代码随想录day02。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

977.有序数组的平方

● 力扣题目链接
● 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

思路

● 暴力排序,时间复杂度O(n + nlogn)
● 使用双指针,时间复杂度O(n)

代码

class Solution {
    public int[] sortedSquares(int[] nums) {
        int[] res = new int[nums.length]; // 返回的数组,这个题目没法原地修改
        int l = 0; int r = nums.length -1;
        for (int i = res.length - 1; i >= 0; i--) { // 遍历返回的数组,每个元素都要放到适合的位置
            if (nums[l] * nums[l] > nums[r] * nums[r]) {
                res[i] = nums[l] * nums[l]; // 左边大
                l++; // 左指针右移
            } else {
                res[i] = nums[r] * nums[r]; // 右边大
                r--; // 右指针左移
            }
        }
        return res;
    }
}
// 思路一样,换成while循环
class Solution {
    public int[] sortedSquares(int[] nums) {
        int[] res = new int[nums.length];
        int l = 0; int r = nums.length - 1;
        int index = nums.length - 1;
        while (l <= r) {
            if (nums[l] * nums[l] > nums[r] * nums[r]) {
                res[index--] = nums[l] * nums[l];
                l++;
            } else {
                res[index--] = nums[r] * nums[r];
                r--;
            }
        }
        return res;
    }
}

209.长度最小的子数组

● 力扣题目链接
● 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
思路
● 可以暴力解法,外层循环遍历数组,内层不断往后看,更新长度的最小值
● 也可以使用滑动窗口
○ 外层循环遍历数组,不断移动快指针,加到sum
○ 一旦发现超过target,就开始移动慢指针,更新res,减去元素
○ 最后看res是否更新过

代码

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int s = 0; int sum = 0; int res = Integer.MAX_VALUE;
        for (int f = 0; f < nums.length; f++) { // 外层循环遍历数组
            sum += nums[f];
            while (sum >= target) { // 一旦超过target
                res = Math.min(res, f - s + 1); // 更新res
                sum -= nums[s++]; // 移动慢指针,减去元素
            }
        }
        return res == Integer.MAX_VALUE ? 0 : res; // 看res是否更新过
    }
}

59.螺旋矩阵II

● 力扣题目链接
● 给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

思路

● 设置四个边界,不断循环处理

代码

class Solution {
    public int[][] generateMatrix(int n) {
        int l = 0, r = n - 1, b = 0, t = n - 1, num = 0, tar = n * n;
        int[][] res = new int[n][n];
        while (num < tar) {
            for (int i = l; i <= r; i++) {
                res[b][i] = ++num;
            }
            b++;
            for (int i = b; i <= t; i++) {
                res[i][r] = ++num;
            }
            r--;
            for (int i = r; i >= l; i--) {
                res[t][i] = ++num;
            }
            t--;
            for (int i = t; i >= b; i--) {
                res[i][l] = ++num;
            }
            l++;
        }
        return res;
    }
}

54.螺旋矩阵

● 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

思路

● 和上一题类似,但是需要注意给集合中加元素不要重复

代码

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        int l = 0, m = matrix.length - 1, b = 0, n = matrix[0].length - 1;
        int r = n, t = m, num = 1;
        List<Integer> res = new ArrayList();
        while (num <= (m + 1) * (n + 1)) {
            for (int i = l; i <= r && num <= (m + 1) * (n + 1); i++) { // 这步判断尽量写上
                res.add(matrix[b][i]);
                num++;
            }
            b++;
            for (int i = b; i <= t && num <= (m + 1) * (n + 1); i++) {
                res.add(matrix[i][r]);
                num++;
            }
            r--;
            for (int i = r; i >= l && num <= (m + 1) * (n + 1); i--) {
                res.add(matrix[t][i]);
                num++;
            }
            t--;
            for (int i = t; i >= b && num <= (m + 1) * (n + 1); i--) {
                res.add(matrix[i][l]);
                num++;
            }
            l++;
        }
        return res;
    }
}

剑指 Offer 29.顺时针打印矩阵

● 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

思路

● 与之前思路类似文章来源地址https://www.toymoban.com/news/detail-639851.html

代码

class Solution {
    public int[] spiralOrder(int[][] matrix) {
        if (matrix == null || matrix.length == 0) return new int[0];
        int m = matrix.length;
        int n = matrix[0].length;
        int[] res = new int[m * n];
        int index = 0, l = 0, r = n - 1, b = 0, t = m - 1;
        while (index <= res.length - 1) {
            for (int i = l; i <= r && index <= res.length - 1; i++) {
                res[index++] = matrix[b][i];
            }
            b++;
            for (int i = b; i <= t && index <= res.length - 1; i++) {
                res[index++] = matrix[i][r];
            }
            r--;
            for (int i = r; i >= l && index <= res.length - 1; i--) {
                res[index++] = matrix[t][i];
            }
            t--;
            for (int i = t; i >= b && index <= res.length - 1; i--) {
                res[index++] = matrix[i][l];
            }
            l++;
        }
        return res;
    }
}

到了这里,关于代码随想录day02的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 代码随想录算法训练DAY27|回溯3

    力扣题目链接 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明: 所有数字(包括 target)都是正整数。 解集不能包含重复的组合。 示例 1: 输入:candidates = [2,3,6,

    2024年01月23日
    浏览(58)
  • 代码随想录算法训练DAY25|回溯2

    力扣题目链接 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。 说明: 所有数字都是正整数。 解集不能包含重复的组合。 示例 1: 输入: k = 3, n = 7 输出: [[1,2,4]] 示例 2: 输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]

    2024年01月22日
    浏览(63)
  • 代码随想录算法练习Day1:二分查找

    题目链接:704. 二分查找 卡哥视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找 二分法概述: 二分法(Binary Search)是一种在有序数组或列表中查找目标元素的算法。 二分法使用前提 : 有序数组或列表 :二分法要求在查找的数据结

    2024年04月23日
    浏览(58)
  • 代码随想录Day02:977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

    977.有序数组的平方 【 题目建议 】: 本题关键在于理解双指针思想 【随想录文章讲解】 【卡哥视频讲解】 方法一:暴力排序法 **思路:**先对数组中每个数进行平方运算,然后再排序 时间复杂度是 O(n + nlogn) 其中包括计算平方数组的O(n)和快速排序的O(nlogn),总体上是O(nlo

    2023年04月27日
    浏览(54)
  • 代码随想录Day20 回溯算法 LeetCode77 组合问题

    以下内容更详细解释来自于:代码随想录 (programmercarl.com) 回溯法也叫回溯搜索法,是搜索法的一种,我们之前在二叉树中也经常使用到回溯来解决问题,其实 有递归就有回溯 ,有的时候回溯隐藏在递归之下,我们不容易发觉,今天我们来详细介绍一下什么是回溯,它能解决哪些问题.

    2024年02月08日
    浏览(54)
  • 【一天三道算法题】代码随想录——Day15(困难题只有一道)

    一. 滑动窗口最大值 题目链接:力扣 思路:         这道题我认为最难的是编程语言本身并没有一个可以让你完全直接开始使用的一个数据结构,也就是说要自己造轮子。并且为了尽可能的减少维护元素的个数我们要学会去在能实现功能的前提下,维护尽可能少的数组元

    2024年02月15日
    浏览(46)
  • 代码随想录day4 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 02.07.链表相交 142.环形链表II

    24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II 两两交换链表中的节点 注意是两两交换,采用虚拟头结点的方法,因为每次操作单链表都需要找到前一个指针。奇数节点数,最后一个不变;偶数节点数,就是正常的两两交换。 操作

    2024年02月16日
    浏览(43)
  • 代码随想录Day50

    昨天因为准备面试所以咕咕了一天。今天继续学习动规算法,尽管背包问题已经结束但其中的各类思想仍需要进一步理解。 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两

    2023年04月14日
    浏览(54)
  • 代码随想录Day62

    今天继续学习单调栈解决相关问题。 nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。 给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。 对于每个 0 = i nums1.length ,找出满足 nums1

    2024年02月01日
    浏览(56)
  • 代码随想录day11

    20. 有效的括号   思路:这里用模拟栈的方法会更好理解,也就是我们每次遇到朝左方向的三种类型的时候,就加入相反方向的右括号到result栈中。由于栈是一个先进后出的方式,所以我们会有一个判断stack当前为不为空,和stack[-1]是不是和当前循环到的括号相同。如果说相同

    2024年02月13日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包