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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 刷题leetcode第二天 -> 正文阅读

[数据结构与算法]刷题leetcode第二天

数组

leetcode 59 螺旋数组2

  1. 看到题目的第一想法
    注意边界值的处理,使用左闭右开的形式,每一次循环的时候都不处理一条边的最后一个值,把它让到下一次处理。并且作为n如果为奇数的话,就要对最中间的值进行处理。
    一开始写的代码如下所示,这里我没有考虑到如果是n=5,7…等等大数的时候,循环的话,每一次都要对起始点进行处理,但是我还是使用i,j两个值,这就会报错。因为i,j是每次循环的起始点是不一样的。因为到下一次循环的时候,i,j赋值的值又是0所以肯定有问题。
 int[][] arr= new int[n][n];
        int count=1;
        int offset=1;
        int i=0,j=0;
        int startx=0;
        int starty=0;
        while((n/2)!=0){
            for(j=0;j<n-offset;j++){
                arr[startx][j]=count++;
            }
            for(i=0;i<n-offset;i++){
                arr[i][j]=count++;
            }
            for(;j>starty;j--){
                arr[i][j]=count++;
            }
            for(;i>startx;i--){
                arr[i][j]=count++;
            }
            startx++;
            starty++;
            offset++;
        }
  1. 看完题解后的想法
    思路没问题,主要就是起始点的变化要处理
    这里我设置了两个值startx,starty用来表示每次开始的起点,而且注意offeset也就是循环到内部的话,这个时候是要offet+=2的。因为我们要再减去一个数而且循环要做减法操作,不然一直是死循环。每次循环都要更新起点这样就可以了。i,j的初始起点也是变化的。
class Solution {
    public int[][] generateMatrix(int n) {
        int[][] arr= new int[n][n];
        int count=1;
        int offset=1;
        int i=0,j=0;
        int startx=0;
        int starty=0;
        int loop=n/2;
        while(loop!=0){
            for(j=starty;j<startx+n-offset;j++){
                arr[startx][j]=count++;
            }
            for(i=startx;i<starty+n-offset;i++){
                arr[i][j]=count++;
            }
            for(;j>starty;j--){
                arr[i][j]=count++;
            }
            for(;i>startx;i--){
                arr[i][starty]=count++;
            }
            startx++;
            starty++;
            offset+=2;
            loop--;
        }
        if(n%2==1){
            int mid=n/2;
            arr[mid][mid]=count;
        }
        return arr;
    }
}
  1. 遇到的困难
    没有想到起始点是要一直变化的,而且循环要做–操作,比如n=3,那么n/2=1所以当做完一次循环之后就结束了。

leetcode 977 有序数组平方

  1. 看到题目的第一想法
    看到题目的第一想法就是把每一项求平方之后然后sort一下。

  2. 看完题解后的想法
    但是显然这不是考察的意图。使用双指针,头一个,尾一个,然后求平方比大小。
    分别让两个指针做++或–操作,但是思路刚开始外面使用一个循环来控制,这里逻辑是对的,但是没有注意到slow<fast还是slow<=fast,可以举例,当slow<fast时,最后会剩余一个元素没有加到数组中会造成失败。

class Solution {
    public int[] sortedSquares(int[] nums) {
        int slow=0;
        int fast=nums.length-1;
        int[] arr = new int[nums.length];
        for(int i=nums.length-1;i>=0 && slow<fast;){
            if(nums[slow]*nums[slow]>nums[fast]*nums[fast]){
                arr[i]=nums[slow]*nums[slow];
                slow++;
            }else{
                arr[i]=nums[fast]*nums[fast];
                fast--;
            }
            i--;
        }
        return arr;
    }
}

还有一种情况就是,我没有注意到循环的是从高到低还是从低到高。这里是有讲究的,因为题目要求最后以从小到大的形式输出数组,所以我们需要把最大的数放到最后,然后依次往前,这样返回数组就是从小到大的。注意下面也是犯了没有slow<=fast的情况。

class Solution {
    public int[] sortedSquares(int[] nums) {
        int slow=0;
        int fast=nums.length-1;
        int[] arr = new int[nums.length];
        for(int i=0;i<nums.length && slow<fast;){
            if(nums[slow]*nums[slow]<nums[fast]*nums[fast]){
                arr[i]=nums[slow]*nums[slow];
                slow++;
            }else{
                arr[i]=nums[fast]*nums[fast];
                fast--;
            }
            i++;
        }
        return arr;
    }
}

修改代码后,让其可以覆盖到所有的元素

class Solution {
    public int[] sortedSquares(int[] nums) {
        int slow=0;
        int fast=nums.length-1;
        int[] arr = new int[nums.length];
        for(int i=nums.length-1;i>=0 && slow<=fast;){
            if(nums[slow]*nums[slow]>nums[fast]*nums[fast]){
                arr[i]=nums[slow]*nums[slow];
                slow++;
            }else{
                arr[i]=nums[fast]*nums[fast];
                fast--;
            }
            i--;
        }
        return arr;
    }
}
  1. 遇到的困难
    一个是没有注意过slow<=fast这个条件,到低是小于还是小于等于。而且循环的遍历条件要注意。

leetcode 209 长度最小子数组

  1. 看到题目的第一想法
    第一想法是使用双指针,两个指针,一个不断的向前读取元素,求和,另一个只要当元素等于target的时候就再做++操作。但是这里取大于还是大于等于不清楚。
    for(fast=slow;slow<fast && fast<nums.length;fast++){
    sum+=nums[fast];
    if(sum==target){
    minlength=fast-slow+1;
    result=result>minlength?minlength:result;
    slow++;
    }else if(sum>target){
    slow++;
    }
    }
    这里逻辑看上去没毛病,其实仔细推一下,每次把slow的值赋给fast,然后又要求slow<fast,这是错误的。不能操作指针。
    错误代码如下:
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int minLength;
        int sum=0;
        int result=Integer.MAX_VALUE;
        int slow=0;
        for(int fast=slow;slow<=fast && fast<nums.length;fast++){
            sum+=nums[fast];
            if(sum==target){
                minLength=fast-slow+1;
                result=result>minLength?minLength:result;
                slow++;
            }else if(sum>target){
                slow++;
            }
        }
        return result==Integer.MAX_VALUE?0:result;
    }
}
  1. 看完题解后的想法
    要采用双指针,和我的想法一样,但是再做操做的时候,只要出现大于等于target就把sum-=nums[slow++];减去nums[slow]的值,而且注意,可能这里的值剪完之后依然大于target,所以必须放到while循环内处理。
    正确代码如下
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int minLength;
        int sum=0;
        int result=Integer.MAX_VALUE;
        int slow=0;
        for(int fast=0;slow<=fast && fast<nums.length;fast++){
            sum+=nums[fast];
            while(sum>=target){
                minLength=fast-slow+1;
                result=result>minLength?minLength:result;
                sum-=nums[slow++];
            }
        }
        return result==Integer.MAX_VALUE?0:result;
    }
}
  1. 遇到的困难
    这里的困难就是,不清楚移除的是指针还是对应的值,而且移除操作要放到循环内处理。
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 21:19:25  更:2022-09-24 21:23:54 
 
开发: 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年5日历 -2024/5/19 18:44:46-

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