LeetCode Day2|911.有序数组的平方(平方+快排|双指针+额外数组)、209.长度最小的子字符串(滑动窗口)、59螺旋矩阵||(循环不变量+区间的定义)

本文讲述了作者在解决编程题目中的三个挑战:使用平方加快排法对有序数组求平方,利用双指针和额外数组优化,以及通过滑动窗口解决长度最小子字符串问题。作者强调了坚持和整理的重要性,尤其是在面对拖延任务时。
摘要由CSDN通过智能技术生成

day2-1. 911有序数组的平方

  • 通过花费的时间:00:03:00
  • 总结整理吃透这道题总共花费的时间: 00:17:00
  • 看到题目的第一想法: ①平方+快排:时间复杂度O(n+nlogn) +空间复杂度O(logN)②双指针+额外数组:时间复杂度O(n)+空间复杂度O(n)
  • 解题过程中遇到的问题:比较顺畅一气呵成
  • 此题收获:给自己一个信念,相信坚持的力量,拖了几天的任务,后面加油赶回来
class Solution {
    // 平方+快排
    public int[] sortedSquares(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            nums[i] = nums[i] * nums[i];
        }
        Arrays.sort(nums,0,nums.length-1);
        return nums;
    }
    //双指针+额外数组
    public int[] sortedSquares(int[] nums) {
        int right = nums.length - 1;
        int left = 0;
        int result[] = new int[nums.length];
        int index = nums.length - 1;
        while(left<=right){
            if(nums[right]*nums[right] > nums[left]*nums[left]){
                result[index] = nums[right]*nums[right];
                index --;
                right--;
            }else{
                result[index] = nums[left]*nums[left];
                index--;
                left++;
            }
        }
        return result;
    }
}

day2-2. 209长度最小的子字符串

  • 通过花费的时间:00:18:00(做题的过程写注释有点慢)
  • 总结整理吃透这道题+博客总共花费的时间: 00:26:59
  • 看到题目的第一想法: 模糊记得是做过,但是还是达不到一气呵成的水平,看了一下视频才更深的理解了该题
  • 解题过程中遇到的问题:①注意点:滑动窗口的启示位置和终止位置;while处是持续移动 ②写题过程中出现的错误:我人傻了把for写成if,报错还看老一会儿
  • 此题收获:给自己一个信念,相信坚持的力量,拖了几天的任务,后面加油赶回来,加油 !
class Solution {
    // 滑动窗口
    public int minSubArrayLen(int target, int[] nums) {
        // left:滑动窗口的起始位置 right:滑动窗口的终止位置 
        int left = 0;
        // 滑动窗口中的值之和
        int sum =  0;
        // 返回值(连续子串的长度)
        int result = Integer.MAX_VALUE;
        for(int right = 0; right < nums.length; right++){
            sum += nums[right];
            // 持续移动,直到滑动窗口中的值之和<target
            while(sum >= target){
								// right - left +1:滑动窗口的长度
                result = Math.min(result, right - left +1);
                sum -= nums[left];
                left++;
            }
        }
        return result == Integer.MAX_VALUE ? 0 :result;
    }
}

day2-3. 59螺旋矩阵||

  • 通过花费的时间:00:37:56(做题的过程写注释有点慢,但是对于辅助写代码还是很有必要的)
  • 总结整理吃透这道题+博客总共花费的时间: 00:43:42
  • 看到题目的第一想法: 模糊记得是做过,但是还是达不到一气呵成的水平,(看了一下视频才更深的理解了该题,自己完整敲下来才真正的通畅了)。
  • 解题过程中遇到的问题: ①临界问题:循环不变量法则,每次循环的起止保证循环次数相同,起止相同 ②变量问题:loop、count、i、j都是公共变量才能保证持续性
  • 此题收获:给自己一个信念,相信坚持的力量,拖了几天的任务,后面加油赶回来,加油 ,加油
class Solution {
    public int[][] generateMatrix(int n) {
        // 控制循环的圈数
        int loop = 0;
        // 返回结果
        int[][] result = new int[n][n];
        // 填充数字(公共变量)
        int count = 1;
        // 每轮循环起始的位置(start,start)
        int start = 0;
        // i:从上到下的轴 j:从左到右的轴
        int i,j;
        // 开始每一轮循环
        // 处理边界条件的办法:就代入n=3 然后记得循环不变量法则
        while (loop++ < n/2){//第一轮进去 loop为1
            // 上侧从左到右
            for(j = 0; j < n - loop; j++){// 1 2
                result[start][j] = count++;
            }
            // 右侧从上到下
            for(i = 0; i < n - loop; i++){// 3 4
                result[i][j] = count++;
            }
            // 下侧从右到左
            for(; j >= loop; j--){// 5 6
                result[i][j] = count++;
            }
            // 左侧从下到上
            for(; i >= loop; i--){// 7 8
                result[i][j] = count++;
            }
            // 下一轮循环的位置沿着对角线(1->9->5)的位置移动
            start++;
        }
        // 单独处理n为奇数的情况
        if(n%2==1){
            result[n/2][n/2] = count;
        }
        return result;
    }
}

数组

基础知识

二分查找

  • 循环不变量 区间的定义

移除元素

  • 双指针

长度最小的数组

  • 平方+快排
  • 双指针+额外数组

最小覆盖子串

  • 滑动窗口

旋转数组||

  • 循环不变量 区间的定义
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值