Leetcode 易错题整理(一)5. 7. 11. 15. 33. 34

news2024/10/6 20:35:02

5. 最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

我们可以根据前面的子串结果,在头尾拼接上一个字符并判断其是否相同。DP

class Solution {
    public String longestPalindrome(String s) {
        int len=s.length();
        int maxStart = 0; 
        int maxEnd = 0; 
        int maxLen = 1; 
        boolean[][] isReverse=new boolean[len][len];
        for(int j=1;j<len;j++){
            for(int i=0;i<len;i++){
                //if(j-i+1<maxLen)continue;
                if((s.charAt(i)==s.charAt(j))&&((j-i<=2)||(isReverse[i+1][j-1]))){
                    isReverse[i][j]=true;
                    if(j-i+1>maxLen){
                        maxLen=j-i+1;
                        maxEnd=j;
                        maxStart=i;
                    }
                }
                else isReverse[i][j]=false;
            }
        }
        return s.substring(maxStart,maxEnd+1);
    }
}

注意第一层循环是右指针,第二层循环是左指针。这样才能用到前面的结果。

7. 整数反转

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:

输入:x = 123
输出:321

翻转好做,但是有个要求:翻转后的数字大小超出了 int 范围则返回0.

我们用 long 存储翻转后的数字,如果 (int)res!=res 就返回0.

11. 盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0)(i, height[i])

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

**说明:**你不能倾斜容器。

img

如图,给定一个 height[] 数组,让我找到盛水最高的两条边。

思路:直接遍历超时。首先我们让左右指针到最左最右。算出当前面积。

然后我们左右指针往里挪,底边变短,那么我们必须想办法让 height 最小值增加才能有面积的提升,因此我们让最矮的 height 那边指针先动,比如上图就是右边红色指针先动。这样效率高。

15. 三数之和

找到三数求和=0的所有组合。不能重复。肯定是不能直接遍历,太慢了。

  1. 排序数组。
  2. 从左到右遍历 i,从第二次遍历开始判断当前位数值和上一次循环是否相同,相同直接 continue.
  3. 从 i+1 到右遍历 j,和 i 一样如果和上次循环值一样则 continue。
  4. 从 nums.length-1 往左遍历 k。逻辑是我们固定了 i j,逐渐减小 k,直至找到求和=0的组合。如果求和结果 <0,说明 i j 太小了,继续尝试下一个 j。如果求和结果 >0 则一直向左移动 k 指针,直到求和结果=0或者 jk 相遇或者求和结果 <0. jk 相遇说明这个 i j 组合过大了,接下来 j 再继续增大求和结果也只会更大,没有继续尝试的必要了,因此直接跳出当前 j 循环即可。求和结果 <0 则尝试下一个 j。
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List resList=new ArrayList<List>();
        int i=0,len=nums.length;
        for(;i<len-2;i++){
            if(i>0&&nums[i]==nums[i-1])continue;
            int target=-nums[i];
            for(int j=i+1;j<len-1;j++){
                if(j>i+1&&nums[j]==nums[j-1])continue;
                int k=len-1;
                while(j<k&&nums[j]+nums[k]>target)k--;
                if(j==k)break;
                else if(nums[j]+nums[k]==target){
                    List subList=new ArrayList<Integer>();
                    subList.add(nums[i]);
                    subList.add(nums[j]);
                    subList.add(nums[k]);
                    resList.add(subList);
                }
            }
        }
        return resList;
    }
}

33. 下一个排列

整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。

  • 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3][1,3,2][3,1,2][2,3,1]

整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。

  • 例如,arr = [1,2,3] 的下一个排列是 [1,3,2]
  • 类似地,arr = [2,3,1] 的下一个排列是 [3,1,2]
  • arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。

给你一个整数数组 nums ,找出 nums 的下一个排列。

必须** 原地 **修改,只允许使用额外常数空间。

主要就是算法。

  1. 第一遍,遍历数组检查是否为倒序,找到第一个不为倒序的位置。
  2. 第一个不为倒序的位置和它后面的数作比较,找到一个刚好大于他的最小的数,换到他的位置,然后排序其后面的位置。
  3. 如果全部满足为倒序排序,那么数组反转。
class Solution {
    public void swap(int[] nums, int i, int j){
        nums[i]=nums[i]^nums[j];
        nums[j]=nums[i]^nums[j];
        nums[i]=nums[i]^nums[j];
    }

    public void reverse(int[] nums){
        for(int i=0;i<=nums.length/2-1;i++){
            swap(nums, i, nums.length-1-i);
        }
    }

    public void nextPermutation(int[] nums) {
        int len=nums.length;
        int i=len-1;
        while(i!=0&&!(nums[i-1]<nums[i])){
            i--;
        }
        if(i==0)reverse(nums);
        else {
            i--;
            int min=101;
            for(int j=len-1;j>i;j--){
                if(nums[j]<min&&nums[j]>nums[i]){
                    swap(nums, i, j);
                    Arrays.sort(nums,i+1,len);
                    return;
                }
            }
        }
    }
}

34. 在排序数组中查找元素的第一个和和最后一个位置

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

是二分法,但是不完全是,因为我们要找到起始区间。

我们可以通过两次二分,第一次找起始位置或小于目标值的最大的数的位置;第二次找结束位置或大于目标值的最小数的位置。

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int len=nums.length;
        int[] res=new int[2];
        res[0]=-1;
        res[1]=-1;
        int left=0,right=len-1;
        while(left<=right){
            int mid=(left+right)/2;
            if(nums[mid]>=target){right=mid-1;res[0]=mid;}
            else left=mid+1;
        }

        left=0;right=len-1;
        while(left<=right){
            int mid=(left+right)/2;
            if(nums[mid]>target){right=mid-1;res[1]=mid;}
            else left=mid+1;
        }
        res[1]=right;
        if(!(res[0]<=res[1])||res[0]==-1||res[1]==-1){
            res[0]=-1;
            res[1]=-1;
        }
        return res;
    }
}

如果数组中一定存在给定数,那么只靠两个 while 循环是可以找到起始和结束位置的。但是如果不存在,这两个循环查询可能会出现一些错误,比如一个是找到的位置,一个是-1;或者 right<left。这种情况要单独判别后,再决定返回值。

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

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

相关文章

ssm+vue中国咖啡文化宣传网站源码和论文

ssmvue中国咖啡文化宣传网站源码和论文078 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 课题背景 随着时代的发展和人们生活理念的进一步改变&#xff0c;咖啡业已经成为了全球经济中发展最迅猛的产业之一。…

计算机网络高频面试题解(一)

1. OSI七层模型 2. TCP/IP五层模型 3. TCP、UDP区别 4. TCP三次握手 5. TCP四次挥手 6. TCP状态转换图 7.TCP状态中TIME_WAIT作用 8. TCP连接建立为什么不是两次握手 9. TCP第三次握手失败会出现什么 10. TCP长连接和短链接及优缺点

windows server dfs复制 命名空间

环境准备 1、ad域控服务器 1台 2、文件服务器 2台&#xff0c;要加域 3、windows客户都1台&#xff0c;测试用 实现功能 负载均衡 &#xff08;文件服务器1&#xff1a;负责部门1&#xff0c;部门2的共享文件访问&#xff0c; 文件服务器2&#xff1a;负责部门3&#xff0c;…

无客户端网络准入方案,为集成电路企业终端管理开启省事更省心模式

宁盾无客户端网络准入控制方案正在成为先进制造、高科技互联网企业等创新型客户的优选方案。创新型客户以技术密集型、研发人员占比高著称&#xff0c;在进行网络准入建设时&#xff0c;如何平衡好用户体验与顺利达成项目预期之间的矛盾&#xff0c;是创新企业 IT 安全团队格外…

什么是IOC?为什么要使用IOC?

什么是IOC&#xff1f; IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;是一种设计原则和编程思想&#xff0c;它在软件开发中用于管理组件之间的依赖关系&#xff0c;提高代码的松耦合性和可维护性。IOC 的核心思想是将组件之间的依赖关系反转&#xf…

星融元:面向校园网的云化园区网络解决方案发布

校园网改造漫漫长路&#xff0c;修修补补何时到头&#xff1f; 这一次我们从底层网络架构入手&#xff0c;通过引入云数据中心长期践行的先进技术理念&#xff0c;直击问题根源&#xff01;接下来我们将从核心架构&#xff0c;无线网络设计、出口安全和内网接入安全等角度介绍 …

从0开始分析ipa之 Hopper Disassembler 反编译工具的使用

在iOS逆向中&#xff0c;反编译工具扮演着至关重要的角色&#xff0c;帮助开发者深入理解和分析应用程序的内部结构。Hopper Disassembler 是一款备受推崇的工具&#xff0c;它可以帮助我们解开应用程序的面纱&#xff0c;探索其中的奥秘。本文将从零开始&#xff0c;介绍如何使…

CSS实现白天/夜晚模式切换

目录 功能介绍 示例 原理 代码 优化 总结 功能介绍 在网页设计和用户体验中&#xff0c;模式切换功能是一种常见的需求。模式切换可以为用户提供不同的界面外观和布局方案&#xff0c;以适应其个人偏好或特定环境。在这篇博客中&#xff0c;我们将探索如何使用纯CSS实现一…

生产消费者模型概念以及代码

概念 何为生产消费者模型&#xff1f;在设计的角度上看&#xff0c;普通的进程间通信&#xff0c;可以认为发送信息与接收信息的人是同步的。 生产者发信号消费者立刻就会收到。这样的做法虽然提高了效率&#xff0c;但是如果生产者和消费者一旦有一方出现问题就是影响另一方 …

OLBY应用APP说明支持

OLBY应用APP说明支持 OLBY是一款支持在线调节鱼缸灯光控制的APP 支持模拟日出日落&#xff0c;给用户在手持端也可以很好的操作控制设备 技术支持 zcj 331163.com

Rancher上的应用服务报错:413 Request Entity Too Large

UI->rancher的ingress->UI前端(在nginx里面)->zuul->server 也就是说没经过一次http servlet 都要设置一下大小 1.rancher的ingress 当出现Request Entity Too Large时&#xff0c;是由于传输流超过1M。 1、需要在rancher的ingress中设置参数解决。 配置注释&a…

微前沿 | 第1期:强可控视频生成;定制化样本检索器;用脑电重建视觉感知;大模型鲁棒性评测

欢迎阅读我们的新栏目——“微前沿”&#xff01; “微前沿”汇聚了微软亚洲研究院最新的创新成果与科研动态。在这里&#xff0c;你可以快速浏览研究院的亮点资讯&#xff0c;保持对前沿领域的敏锐嗅觉&#xff0c;同时也能找到先进实用的开源工具。 本期内容速览 01. 强可…

在线帮助中心也属于知识管理的一种吗?

在线帮助中心是企业或组织为了提供客户支持而建立的一个在线平台&#xff0c;它包含了各种类型的知识和信息&#xff0c;旨在帮助用户解决问题和获取相关的信息。从知识管理的角度来看&#xff0c;可以说在线帮助中心也属于知识管理的一种形式。下面将详细介绍在线帮助中心作为…

Element——table排序,上移下移功能。及按钮上一条下一条功能

需求&#xff1a;table排序&#xff0c;可操作排序上移下移功能。判断第一行上移禁用和最后一行下移禁用&#xff0c;排序根据后端返回的字段 <el-table:data"tableData"style"width: 100%"><el-table-column type"index" label"序…

Docker容器中的Postgresql备份脚本异常解决办法

本文基于K8S中Docker容器对postgres数据库进行备份的操作&#xff0c;编写好脚本后&#xff0c;手动执行脚本是正常的&#xff0c;但是crontab定时实行却报错&#xff0c;报错信息为kubectl command not found&#xff0c;提示没有找到kubectl指令。 本文主要介绍对该报错信息…

Mybatis 复杂结果映射(ResultMap) - 一对多关系映射

上一篇内容我们介绍了Mybatis结果映射&#xff0c;使用结果映射可以在数据库表中字段与类中字段不一致时解决数据映射的问题&#xff0c;本篇我们在上一篇的基础上深入了解结果映射&#xff0c;使用复杂的结果映射解决一对多关系中复杂的数据映射问题。 如果您对结果映射不太了…

长胜证券:看好未来市场情绪和景气度持续修复下的券商板块机遇

摘要 【长胜证券&#xff1a;看好未来商场心情和景气量继续修正下的券商板块机会】买卖佣钱的下调直接下降出资者买卖成本&#xff0c;有望激活商场、提振交投活泼度。一起&#xff0c;当时方针处于良性周期&#xff0c;估计活泼资本商场相关办法有望逐步落地&#xff0c;为券…

专业制造一体化ERP系统,专注于制造工厂生产管理信息化,可定制-亿发

制造业是国民经济的支柱产业&#xff0c;对于经济发展和竞争力至关重要。在数字化和智能化趋势的推动下&#xff0c;制造业正处于升级的关键时期。而ERP系统&#xff0c;即企业资源计划系统&#xff0c;能够将企业的各个业务环节整合起来&#xff0c;实现资源的有效管理和信息的…

No124.精选前端面试题,享受每天的挑战和学习

文章目录 vue中如何获取节点元素&#xff0c;如何获取单个节点&#xff0c;如何获取多个节点vue中的v-for和v-if哪个优先级高&#xff0c;vue2和vue3分开介绍&#xff0c;并说明会产生什么后果介绍一下ts比js的优势&#xff0c;以及在哪些场景用过ts的一些数据类型有什么区别&a…

c#在MVC Api(.net framework)当中使用Swagger,以及Demo下载

主要的步骤就是创建项目&#xff0c;通过nuget 添加Swashbuckle包&#xff0c;然后在SwaggerConfig当中进行相关的配置。 具体的步骤&#xff0c;可以参考下面的链接&#xff1a; https://www.cnblogs.com/94pm/p/8046580.htmlhttps://blog.csdn.net/xiaouncle/article/detail…