leetcode刷题(51-60)

news2024/11/16 16:54:10

算法是码农的基本功,也是各个大厂必考察的重点,让我们一起坚持写题吧。

遇事不决,可问春风,春风不语,即是本心。

我们在我们能力范围内,做好我们该做的事,然后相信一切都事最好的安排就可以啦,慢慢来,会很快,向前走,别回头。

目录

1、N皇后

2、N皇后II

3、最大子数组和

4、螺旋矩阵

5、跳跃游戏

6、合并区间

7、插入区间

8、最后一个单词的长度

9、螺旋矩阵II

10、排列序列


1、N皇后

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/n-queens/description/思路:回溯标记法,用三个集合标记在列、主对角线、副对角线是否出现过,标记数组标记每行皇后所在的列,递归生成N皇后即可。

class Solution {
    public List<List<String>> solveNQueens(int n) {
        // 三个集合,用于标记每一列、主对角线、副对角线有没有放置皇后
        Set<Integer> column = new HashSet<>() ;
        Set<Integer> left = new HashSet<>() ;
        Set<Integer> right = new HashSet<>() ;
        List<List<String>> ans = new ArrayList<>() ;
        // 标记数组,用于标记每一行皇后所在的列
        int [] queues = new int [n] ;
        Arrays.fill(queues, -1) ;
        dfs(0,n,queues,column,left,right,ans) ;
        return ans ;
    }
    public void dfs(int row, int n, int [] queues, Set<Integer> column, Set<Integer> left, Set<Integer> right, List<List<String>> ans){

        if(row == n){
            List<String> list = new ArrayList<>() ;
            list = genList(queues,n) ;
            ans.add(new ArrayList(list)) ;
        }else{
            for(int i=0; i<n; i++){
                if(column.contains(i)){
                    continue ;
                }
                if(left.contains(row-i)){
                    continue ;
                }
                if(right.contains(row+i)){
                    continue ;
                }
                queues[row] = i ;
                column.add(i) ;
                left.add(row - i) ;
                right.add(row + i) ;
                dfs(row+1,n,queues, column, left, right, ans) ;
                queues[row] = -1 ;
                column.remove(i) ;
                left.remove(row - i) ;
                right.remove(row + i) ;
            }
        }
    }
    public List<String> genList(int [] queues, int n){
        List<String> list = new ArrayList<>() ;
        for(int i=0; i<n; i++){
            char [] c = new char [n] ;
            Arrays.fill(c,'.') ;
            c[queues[i]] = 'Q' ;
            String str = new String(c) ;
            list.add(str) ;
        }
        return list ;
    }
}

2、N皇后II

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/n-queens-ii/description/

思路:这题的解题思路和上一题类似,回溯标记法,每次找出一个方案,就累计一次即可。

class Solution {
    public int totalNQueens(int n) {
        Set<Integer> coulumn = new HashSet<>() ;
        Set<Integer> left = new HashSet<>() ;
        Set<Integer> right = new HashSet<>() ;
        return dfs(0,n,coulumn,left,right) ;
    }
    public int dfs(int row, int n, Set<Integer> coulumn, Set<Integer> left, Set<Integer> right){
            if(row == n){
                return 1 ;
            }
            
            int cnt = 0 ;
            for(int i=0; i<n; i++){
                if(coulumn.contains(i)){
                    continue ;
                }
                if(left.contains(row - i)){
                    continue ;
                }
                if(right.contains(row + i)){
                    continue ;
                }
                coulumn.add(i) ;
                left.add(row - i) ;
                right.add(row + i) ;
                cnt += dfs(row + 1, n, coulumn, left, right) ;
                coulumn.remove(i) ;
                left.remove(row - i) ;
                right.remove(row + i) ;
            }
            return cnt ;
        }
}

3、最大子数组和

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/maximum-subarray/

思路:本质上是一种贪心策略,当前累加的和大于0,就继续累加,否则不累加,整个过程中计算最大值即可。

class Solution {
    public int maxSubArray(int[] nums) {
        int max = Integer.MIN_VALUE ;
        int sum = 0 ;
        for(int i=0; i<nums.length; i++){
            sum = (sum >= 0 ? sum + nums[i] : nums[i]) ;
            max = Math.max(max, sum) ;
        }
        return max  ;
    }
}

4、螺旋矩阵

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/spiral-matrix/

思路:top和bottom模拟上下的位置,left和right模拟左右的位置,在while循环里面,使用for循环模拟顺时针打印矩阵元素。

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> ans = new ArrayList<>() ;
        // 模拟旋转过程
        int top = 0,  bottom = matrix.length-1, left = 0, right = matrix[0].length-1;
        while(true){
            for(int i=left; i<=right; i++){
                ans.add(matrix[top][i]) ;
            }
            top ++ ;
            if(top > bottom){
                break ;
            }
            for(int i=top; i<=bottom; i++){
                ans.add(matrix[i][right]) ;
            }
            right --;
            if(left > right){
                break ;
            }
            for(int i=right; i>=left; i--){
                ans.add(matrix[bottom][i]) ;
            }
            bottom -- ;
            if(top > bottom){
                break ;
            }
            for(int i=bottom; i>=top; i--){
                ans.add(matrix[i][left]) ;
            }
            left ++ ;
            if(left > right){
                break ;
            }
        }
        return ans ;
    }
  
}

5、跳跃游戏

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/jump-game/description/

思路:从后向前反退,用step进行标记,step初始化为1,不能跳到当前步,则step+1,否则step更新为1,最后step为1,则表示可以由最初位置跳到最后。

class Solution {
    public boolean canJump(int[] nums) {
        int n = nums.length ;
        if(n==1){
            return true ;
        }
        int step = 1 ;
        for(int i=n-2; i>=0; i--){
            if(nums[i]>=step){
                step = 1 ;
            }else{
                step ++ ;
            }
        }
        return step == 1 ? true : false ;
    }
}

6、合并区间

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/merge-intervals/

思路:首先需要进行排序,区间的最左侧元素进行排序,然后以此对比当前区间的右侧和下一个区间的左侧元素,决定是否进行合并区间。

当前区间右侧元素 < 下一区间左侧元素。无重叠,直接加入集合

反之,合并区间:注意合并区间,是选择右侧元素的最大值。

class Solution {
    public int[][] merge(int[][] intervals) {

        List<int []> list = new ArrayList<>() ;
        Arrays.sort(intervals, new Comparator<>(){
            public int compare(int [] o1, int [] o2){
                return o1[0] - o2[0] ;
            }
        }) ;

        for(int i=0; i<intervals.length; i++){
            int left = intervals[i][0], right = intervals[i][1] ;
            if(list.size() == 0 || list.get(list.size()-1)[1] < left){
                list.add(new int []{left, right}) ;
            }else{
                // 合并区间
                list.get(list.size()-1)[1] = Math.max(list.get(list.size()-1)[1], right) ;
            }
        }
        int [][] res = new int [list.size()][2] ;
        for(int i=0; i<list.size(); i++){
            res[i][0] = list.get(i)[0] ;
            res[i][1] = list.get(i)[1] ;
        }
        return res ;
    }
}

7、插入区间

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/insert-interval/description/

思路:和上面一题的思路一致,唯一的区别就是开辟一个新数组,将两个数组合并到新数组,然后在进行合并合并区间。

class Solution {
    public int[][] insert(int[][] intervals, int[] newInterval) {
        int [][] tmp = new int [intervals.length+1][2] ;
        for(int i=0; i<intervals.length; i++){
            tmp[i][0] = intervals[i][0] ;
            tmp[i][1] = intervals[i][1] ;
        }
        tmp[tmp.length-1][0] = newInterval[0] ;
        tmp[tmp.length-1][1] = newInterval[1] ;
        List<int []> list = new ArrayList<>() ;
        Arrays.sort(tmp, new Comparator<>(){
            public int compare(int [] o1, int [] o2){
                return o1[0] - o2[0] ;
            }
        }) ;
        for(int i=0; i<tmp.length; i++){
            int left = tmp[i][0], right = tmp[i][1] ;
            if(list.size()==0 || list.get(list.size()-1)[1] < left){
                list.add(new int []{left, right}) ;
            }else{
                list.get(list.size()-1)[1] = Math.max(list.get(list.size()-1)[1], right) ;
            }
        }
        int [][] res = new int [list.size()][2] ;
        for(int i=0; i<res.length; i++){
            res[i][0] = list.get(i)[0] ;
            res[i][1] = list.get(i)[1] ;
        }
        return res ;
    }
}

8、最后一个单词的长度

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/length-of-last-word/

思路:先删除前后的空格,然后从后向前判断,不等于空格,计数器加1,等于空格结束。

class Solution {
    public int lengthOfLastWord(String s) {
       int cnt = 0 ;
       s = s.trim() ;
       for(int i=s.length()-1; i>=0; i--){
        if(s.charAt(i) != ' '){
            cnt ++ ;
        }else{
            break ;
        }
       } 
       return cnt ;
    }
}

9、螺旋矩阵II

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/spiral-matrix-ii/description/

思路:和螺旋矩阵I的思路一样,只不是这是新建一个数组进行模拟而已,本质上都是定义上下左右四个边界,模拟顺时针旋转并更新四个边界值。

class Solution {
    public int[][] generateMatrix(int n) {
        int [][] res = new int [n][n] ;
        int left = 0, right = n-1, top = 0, bottom = n-1 ;
        int v = 1 ;
        while(true){
            for(int i=left; i<=right; i++){
                res[top][i] = v ++ ;
            }
            top ++ ;
            if(top>bottom){
                break ;
            }
            for(int i=top; i<=bottom; i++){
                res[i][right] = v ++ ;
            }
            right -- ;
            if(left > right){
                break ;
            }
            for(int i=right; i>=left; i--){
                res[bottom][i] = v ++ ;
            }
            bottom -- ;
            if(top > bottom){
                break ;
            }
            for(int i=bottom; i>=top; i--){
                res[i][left] = v ++ ;
            }
            left ++ ;
            if(left > right){
                break ;
            }
        }
        return res ;
    }
}

10、排列序列

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/permutation-sequence/description/

思路:全排列+根据字符串进行排序即可。

class Solution {
    public String getPermutation(int n, int k) {
        String s = "" ;
        for(int i=1; i<=n; i++){
            s+= i ;
        }
        List<String> list = new ArrayList<>() ;
        boolean [] vis = new boolean[n] ;
        dfs(list,s,n, new StringBuilder(""), vis) ;
        Collections.sort(list) ;
        return list.get(k-1) ;
    }
    public void dfs(List<String> list, String s, int n, StringBuilder sb, boolean [] vis){
        if(sb.length() == n){
            list.add(sb.toString()) ;
        }
        for(int i=0; i<n; i++){
            if(vis[i]){
                continue ;
            }
            vis[i] = true ;
            sb.append(s.charAt(i)) ;
            dfs(list, s, n, sb, vis) ;
            sb.deleteCharAt(sb.length()-1) ;
            vis[i] = false ;
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1900949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BES 平台 SDK之ANC 参数调整

前言: 最近项目开发进入到DV 阶段,客户临时提了一个需求,希望在ota升级的时候,保留ANC 参数下的total_gain 值,ota只更新滤波器相关参数。total_gain 继续使用产线校准好的值。 一:ANC 参数 1.首先需要找到代码对应ANC 加载的函数: best1502x_ibrt_anc_…

TeXstudio对已加载宏包的命令标记为暗红色未知命令

宏包已正常加载&#xff0c;编译也正常&#xff0c;但却将某些命令标记为暗红色。 具体的原因可参考 https://sourceforge.net/p/texstudio/wiki/Frequently%20Asked%20Questions/#how-does-txs-know-about-valid-commandshttps://sourceforge.net/p/texstudio/wiki/Frequent…

Vue 3集成krpano 全景图展示

Vue 3集成krpano 全景图展示 星光云全景系统源码 VR全景体验地址 星光云全景VR系统 将全景krpano静态资源文件vtour放入vue项目中 导入vue之前需要自己制作一个全景图 需要借助官方工具进行制作 工具下载地址&#xff1a;krpano工具下载地址 注意事项&#xff1a;vuecli…

(软件06)串口屏的应用,让你的产品显得高级一点(下篇)

本文目录 学习前言 单片机代码实现 学习前言 目前市面上我记得好像有IIC的屏幕、SPI的屏幕、并口屏幕、还有就是今天我们介绍的这个串口屏了&#xff0c;串口屏&#xff0c;就是用串口进行通讯的&#xff0c;上篇我们已经介绍了屏幕供应商提供的上位机软件进行配置好了&#…

两年经验前端带你重学前端框架必会的ajax+node.js+webpack+git等技术的个人学习心得、作业及bug记录 Day1

黑马程序员前端AJAX入门到实战全套教程&#xff0c;包含学前端框架必会的&#xff08;ajaxnode.jswebpackgit&#xff09;&#xff0c;一套全覆盖 Day1 你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​…

前端八股文 对$nextTick的理解

$nexttick是什么? 获取更新后的dom内容 为什么会有$nexttick ? vue的异步更新策略 (这也是vue的优化之一 要不然一修改数据就更新dom 会造成大量的dom更新 浪费性能) 这是因为 message &#xff08;data&#xff09;数据在发现变化的时候&#xff0c;vue 并不会立刻去更…

.mkp勒索病毒:深度解析与防范

引言&#xff1a; 在数字化时代&#xff0c;网络安全问题日益严峻&#xff0c;其中勒索病毒作为一种极具破坏性的恶意软件&#xff0c;严重威胁着个人用户和企业机构的数据安全。在众多勒索病毒家族中&#xff0c;.mkp勒索病毒以其强大的加密能力和广泛的传播方式&#xff0c;成…

54、一维和二维自组织映射(matlab)

1、一维和二维自组织映射原理 一维和二维自组织映射&#xff08;Self-Organizing Maps, SOM&#xff09;是一种无监督的机器学习算法&#xff0c;通过学习输入数据的拓扑结构&#xff0c;将高维输入数据映射到低维的网格结构中&#xff0c;使得相似的输入数据点在映射空间中也…

异步调用 - 初识

目录 1、引入 2、同步调用 2.1、例子&#xff1a;支付功能 2.2、同步调用的好处 2.3、同步调用的缺点 3、异步调用 3.1、异步调用的方式 3.2、异步调用的优势 3.3、异步调用的缺点 3.4、什么场景下使用异步调用 3.5、MQ技术选型 1、引入 为什么想要异步通信呢&…

java 线程同步机制 synchronized

synchronized 代码块 的参数 为对象 且要唯一性 synchronized 修饰方法&#xff1a; 非静态是 当前类的实例 this 静态是当前类 :当前类名.class Cclass.class extends有多实例 不能用this 。 用当前类作为唯一标识 synchronized 优缺点

vue3项目图片压缩+rem+自动重启等plugin使用与打包配置

一、Svg配置 每次引入一张 SVG 图片都需要写一次相对路径&#xff0c;并且对 SVG 图片进行压缩优化也不够方便。 vite-svg-loader插件加载SVG文件作为Vue组件&#xff0c;使用SVGO进行优化。 插件网站https://www.npmjs.com/package/vite-svg-loader 1. 安装 pnpm i vite-svg…

查询数据库下所有表的数据量

个人思路: 首先把库里Schema下表名拿出来放记事本(EmEditor)里, 用一下正则匹配替换 (\w) → select \1 tableName,count(1) from \1 union all 然后把最后的union all删除掉,替换为order by tableName

eggNOG-mapper:功能注释集大成者

安装 Home eggnogdb/eggnog-mapper Wiki GitHub git clone https://github.com/eggnogdb/eggnog-mapper.git cd eggnog-mapper python setup.py install # 如果您的 eggnog-mapper 路径是/home/user/eggnog-mapper export PATH/home/user/eggnog-mapper:/home/user/eggnog-…

基于OpenCv的快速图片颜色交换,轻松实现图片背景更换

图片颜色更换 图片颜色转换 当我们有2张图片,很喜欢第一张图片的颜色,第2张图片的前景照片,很多时候我们需要PS进行图片的颜色转换,这当然需要我们有强大的PS功底,当然小编这里不是介绍PS的,我们使用代码完全可以代替PS 进行图片的颜色转换 图片颜色转换步骤: 步骤…

MongoDB 单节点升级为副本集高可用集群(1主1从1仲裁)

作者介绍&#xff1a;老苏&#xff0c;10余年DBA工作运维经验&#xff0c;擅长Oracle、MySQL、PG、Mongodb数据库运维&#xff08;如安装迁移&#xff0c;性能优化、故障应急处理等&#xff09; 公众号&#xff1a;老苏畅谈运维 欢迎关注本人公众号&#xff0c;更多精彩与您分享…

沪上繁花:上海电信的5G-A之跃

2024年6月18日下午&#xff0c;在上海举行的3GPP RAN第104次会议上&#xff0c;3GPP正式宣布R18标准冻结。R18是无线网络面向5G-A的第一个版本&#xff0c;其成功冻结正式宣布了5G发展迎来新机遇&#xff0c;5G-A商用已进入全新的发展阶段。 在5G-A滚滚而来的时代洪流中&#x…

【88 backtrader期货策略】一个基于螺纹钢和铁矿5分钟K线数据的跨品种日内套利策略回测

这是参考其他量化框架的跨品种套利策略并进行修改逻辑后实现的一个交易策略。花了小半天时间,核对了策略逻辑的细节,两者的资金曲线基本是可以对齐了。 提醒 这个统计套利策略回测的时候,有几个坑,会导致实盘和回测的结果出现比较大的差异。在后续文章中,我将分析为什么…

【3D->2D转换(1)】LSS(提升,投放,捕捉)

Lift, Splat, Shoot 这是一个端到端架构&#xff0c;直接从任意数量的摄像头数据提取给定图像场景的鸟瞰图表示。将每个图像分别“提升&#xff08;lift&#xff09;”到每个摄像头的视锥&#xff08;frustum&#xff09;&#xff0c;然后将所有视锥“投放&#xff08;splat&a…

Spring相关面试题(四)

49 JavaConfig方式如何启用AOP?如何强制使用cglib&#xff1f; 在JavaConfig类&#xff0c;加上EnableAspectJAutoProxy 如果要强制使用CGLIB动态代理 &#xff0c;加上(proxyTargetClass true) 加上(exposeProxy true) 就是将对象暴露到线程池中。 50 介绍AOP在Spring中…

word文档没有保存就关闭了怎么恢复?找到正确的方法

昨天写教程的时候&#xff0c;终于完成了一个word文档&#xff0c;以为保存了就直接关了。word提醒我“是否保存”&#xff0c;我直接忽略了。动作一气呵成&#xff0c;毫不犹豫的关闭了。之后才发现我没有保存word文档。这种情况大家有遇到过吗?我们该如何在没有保存的情况下…