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算法之长度最小的子数组[两种解法]



小知识

先对下面文章中使用到的一个工具进行解释,Math;
Math是java提供的一个工具类,此工具类不需要创建对象,相当于一个函数的使用,直接在java中调用使用即可,文中Math.min(1,2);是对min()中的内容进行判断,判断哪一个数据最小,再将最小的数据返回给接收的变量.


一、暴力破解法

对于这种循环增量判断比较的问题,首先想到的就是暴力破解法,简单明了,使用for循环做两层循环,第一个固定值,第二个循环相加判断,直至找出我们想要的数据出来,并记录下来,再出来到第一层更换值,然后再去循环做这一件事,直至数据循环到底.

有不懂的小伙伴,注意代码中的文字注释

public class demoT {
    //暴力破解方法
    public static void main(String[] args) {
        //先定义一个变量
        int[] arr={6,1,2,3,4};
        //定义一个接收数据长度的变量,默认是最大值,方便第一次的接收
        int min=Integer.MAX_VALUE;
        //定义一个接收循环数组总和的变量
        int sum=0;
        //定义一个我们要查找的数据的变量
        int target=7;
        //第一层循环,头部循环,对数组进行小于并减一,防止溢出
        for (int i=0;i<arr.length-1;i++){
            sum+=arr[i];
            if (sum>=target){
                break;
            };
            //第二层循环,身体循环,接收i的值加一并赋值给j,这是对下一个数据的相加.
            for (int j=i+1;j<arr.length;j++){
                sum+=arr[j];
                if (sum>=target){
                    //只要大于等于,就调用Math.min对数据做最小判断.
                    min=Math.min(min,j-i+1);
                    //判断完毕,将总和设置为0,方便下一次的判断.
                    sum=0;
                    break;
                }
            }
        }
        //如果我们想要的数据等于初始化数据,就返回0,如果不是,就返回本身数据.
        System.out.println(min==Integer.MAX_VALUE? 0:min);
    }
}

但是暴力破解效率比较差,在小数据量面前可以,在百万数据量的时候,就可以看出明显的效率问题.

二、使用队列相加实现,可以看成滑动窗口

首先将数组中的数据相加,选出我们要查找的数据总和出来,然后将这组数据以队列形式,如果大于数据,记录给变量,我们就将这组数组头部数据踢出去,再去判断,如果还大于或等于,就再去踢头部数据,直至不满足条件,再将新的数据,也就是队尾下标加一的数据添加进来,再去循环上面的判断,如此直到最后一条数据.

有不懂的小伙伴,注意文字注释内容


public class demoOne {
    //使用队列思维进行解算
    public static void main(String[] args) {

        //首先定义一个数组
        int[] arr={2,1,3,5,4,5,1,1};
        //定义一个我们要查找的长度
        int tatget=7;
        //定义一个用来存储数据组和变量
        int sum=0;
        //这是第一个指针,指向我们的队列尾部长度,也就是我们循环相加的下标.
        int Lidx=0;
        //这是第二个指针,永远指向头部,只要第一个指针不到达指定位置,第二个指针就不动
        int Oidx=0;
        //这是存储最小相加数据的变量,初始化是最大值,因为第一次进入必定要改变.
        int min=Integer.MAX_VALUE;
        //第一层循环,对尾部长度的相加
        while (Lidx<arr.length){
            //先将数据赋值给变量,再自增
            sum+=arr[Lidx++];
            //判断如果大于我们或等于我们想要的数据时,就进入
            while (sum>=tatget){
                //将我们想要的数据放在Math.min中,会自动帮我们识别出最小的数据,并再次赋值给接收变量
                min=Math.min(min,Lidx-Oidx);
                //然后让外面接收总和的变量减去刚才我们相加数组的头部数据,再让头部索引自增1,并给总和重新赋值
                sum-=arr[Oidx++];
            }
        }
        //如果我们想要的数据等于初始化数据,就返回0,如果不是,就返回本身数据.
        System.out.println(min==Integer.MAX_VALUE ? 0:min);



    }

}


三.小结

本章使用java实现了对长度最小的子数组算法的实现,一共使用了两种算法,一种暴力破解,效率较慢,一种队列实现,思维较复杂,当然不止这两种解法,还有很多解法,各位感兴趣的小伙伴,自己动手实现吧.
有哪里不足或者有更好的建议,欢迎留言吐槽,有哪里不懂的小伙伴,可以私信我,我会一一答复,感谢认可,感谢支持!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-07-17 16:48:40  更:2022-07-17 16:52:52 
 
开发: 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 23:47:42-

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