IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 算法Day2|977. 有序数组平方,209.长度最小子数组,59. 螺旋矩阵。 -> 正文阅读

[数据结构与算法]算法Day2|977. 有序数组平方,209.长度最小子数组,59. 螺旋矩阵。

977. 有序数组平方

  • 1.暴力解法(平方后进行排序即可)

 public int[] sortedSquares(int[] nums) {
        int[] ans = new int[nums.length];
        for (int i = 0; i < nums.length; i++) {
            ans[i] = nums[i] * nums[i];
        }
        Arrays.sort(ans);
        return ans;
    }
  • 2.双指针方法(第一种)

  • 所有数都是非负数,那么将每个数平方后,数组仍然保持升序;所有数都是负数,那么将每个数平方后,数组会保持降序。
  • 找到数组中负数与非负数的分界线,分界线左边单调递减,分界线右边单调递增。
  • 两个已经有序的子数组用归并的方法进行排序。
class Solution {
    public int[] sortedSquares(int[] nums) {
        int n = nums.length;
        int[] ans = new int[n];
        //neg正负分界线的位置
        int neg = -1;
        for (int i = 0; i < n; i++) {
            if (nums[i] < 0) {
                neg = i;
            } else {
                break;
            }
        }
        int index = 0;
        //i为分界线位置
        int i = neg;
        //j为分界线右边+1位置
        int j = neg + 1;
        while (i >= 0 || j < n) {
            if (i < 0) {  //i小于0,说明数组不存在负数,j的初始值为-1+1=0
                ans[index] = nums[j] * nums[j];
                j++;
            } else if (j == n) {//j等于n,说明数组只有负数,i的初始值为n-1
                ans[index] = nums[i] * nums[i];
                i--;
            } else if (nums[i] * nums[i] < nums[j] * nums[j]) {
                //负数和非负数都有,i单调递减
                ans[index] = nums[i] * nums[i];
                i--;
            } else {
                //负数和非负数都有,j单调递增
                ans[index] = nums[j] * nums[j];
                j++;
            }
            index++;
        }
        return ans;
    }
}
    
  • 3.双指针方法(第二种)

  • 左指针 0?和右指针 n?1,比较左右指针的数,选择较大的那个逆序放入答案并移动指针

?

class Solution {
      public int[] sortedSquares(int[] nums) {
        int n = nums.length;
        int[] ans = new int[n];
        for (int i = 0, j = n - 1, k = n - 1; i <= j; ) {
            if (nums[i] * nums[i] < nums[j] * nums[j]) {
                ans[k] = nums[j] * nums[j];
                j--;//j为右指针,向左走
            } else {
                ans[k] = nums[i] * nums[i];
                i++;//i为左指针,向右走
            }
            k--;//逆序放入
        }
        return ans;
    }
}
    

209. 长度最小子数组

滑动窗口:

本题中实现滑动窗口,主要确定如下三点:

  • 窗口内是什么?
  • 如何移动窗口的起始位置?
  • 如何移动窗口的结束位置?

窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。

窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。

窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。

解题的关键在于 窗口的起始位置如何移动,如图所示:

?

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        //滑动窗口解法
        int sum = 0;
        int ans = Integer.MAX_VALUE;
        int left = 0;
        //类似双指针,用右指针来确定窗口的走向,比target小,sum就一直加
        for (int right = 0; right < nums.length; right++) {
            sum += nums[right];
            //满足条件,记录最小的长度
            while (sum >= target) {
                ans = Math.min(ans, right - left + 1);
                //减小窗口
                sum -= nums[left++];
            }
        }
        //ans为初始最大值,说明sum比target小,返回0
        if (ans == Integer.MAX_VALUE) {
            return 0;
        }
        return ans;
    }
}

59. 螺旋矩阵

模拟顺时针画矩阵的过程:

  • 填充上行从左到右
  • 填充右列从上到下
  • 填充下行从右到左
  • 填充左列从下到上

?

  • 这里每一种颜色,代表一条边,我们遍历的长度,可以看出每一个拐角处的处理规则,拐角处让给新的一条边来继续画。
  • 这也是坚持了每条边左闭右开的原则。

?

class Solution {
    public int[][] generateMatrix(int n) {
       int[][] ans = new int[n][n];
        int startX = 0, loop = 0, count = 1;
        int i, j;
        while (loop++ < n / 2) {
            //上方:从左到右(左闭右开),不包含最后一个值
            for (j = startX; j < n - loop; j++) {
                ans[startX][j] = count++;
            }
            //右方:从上到下(左闭右开),不包含最后一个值
            for (i = startX; i < n - loop; i++) {
                ans[i][j] = count++;
            }
            //下方:从右到左(左闭右开),不包含最后一个值
            for (; j >= loop; j--) {
                ans[i][j] = count++;
            }
            //左方:从下到上(左闭右开),不包含最后一个值
            for (; i >= loop; i--) {
                ans[i][j] = count++;
            }
            startX++;
        }
        if (n % 2 == 1) {
            ans[startX][startX] = count;
        }
        return ans;
    }
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 12:25:10  更:2022-10-31 12:27:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:48:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码