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

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.hqwc.cn/news/91438.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jvm的内存划分区域

jvm划分5个区域&#xff1a; java虚拟机栈、本地方法栈、堆、程序计数器、方法区。 各个区各自的作用&#xff1a; 1.本地方法栈&#xff1a;用于管理本地方法的调用&#xff0c;里面并没有我们写的代码逻辑&#xff0c;其由native修饰&#xff0c;由 C 语言实现。 2.程序计数…

Cypress web自动化windows环境npm安装Cypress

前言 web技术已经进化了&#xff0c;web的测试技术最终还是跟上了脚步&#xff0c;新一代的web自动化技术出现了&#xff1f; Cypress可以对在浏览器中运行的任何东西进行快速、简单和可靠的测试。 官方地址https://www.cypress.io/,详细的文档介绍https://docs.cypress.io/g…

Microsoft Edge 主页启动diy以及常用的扩展、收藏夹的网站

一、Microsoft Edge 主页启动diy 二、常用的扩展 1、去广告&#xff1a;uBlock Origin 2、翻译&#xff1a; 页面翻译&#xff1a;右键就有了&#xff0c;已经内置了划词翻译 3、超级复制 三、收藏夹的网站

C语言练习7(巩固提升)

C语言练习7 编程题 前言 “芳林新叶催陈叶&#xff0c;流水前波让后波。”改革开放40年来&#xff0c;我们以敢闯敢干的勇气和自我革新的担当&#xff0c;闯出了一条新路、好路&#xff0c;实现了从“赶上时代”到“引领时代”的伟大跨越。今天&#xff0c;我们要不忘初心、牢记…

分类模型评估指标——准确率、精准率、召回率、F1、ROC曲线、AUC曲线

机器学习模型需要有量化的评估指标来评估哪些模型的效果更好。 本文将用通俗易懂的方式讲解分类问题的混淆矩阵和各种评估指标的计算公式。将要给大家介绍的评估指标有&#xff1a;准确率、精准率、召回率、F1、ROC曲线、AUC曲线。 机器学习评估指标大全 所有事情都需要评估好…

人生的回忆

回忆是人类宝贵的精神财富&#xff0c;它们像一串串珍珠&#xff0c;串联起我们生活中的每一个片段。 回忆是时间的见证者&#xff0c;它们承载着我们成长、经历、悲欢离合的点点滴滴。 回忆让我们重温过去的欢笑与眼泪&#xff0c;感受那些已经逝去的时光。它们就像一本翻开的…

深入浅出:手把手教你实现顺序表

一、什么是顺序表 顺序表是一种数据结构&#xff0c;或者说&#xff0c;是数据在内存中存储和管理的一种方式。顺序表要求每个数据要从第一个位置开始&#xff0c;依次挨着放。这就很适合使用C语言中的数组来实现。 很多朋友可能会觉得&#xff0c;那有啥可以讲的&#xff1f;我…

R3LIVE项目实战(4) — 双目相机与激光雷达livox_camera_lidar_calibration联合标定

目录 步骤1: 环境配置 1.1 安装环境和驱动 1.2 安装依赖 1.3 下载源码&#xff0c;编译准备 1.4 程序节点概括 步骤2: 相机内参标定 2.1 前期准备 2.3 cameraCalib标定 2.4 内参结果 步骤3: 标定准备和数据采集 3.1 标定场景准备 3.2 连接雷达 3.3 连接相机 3.4 采…

基于全新电脑环境安装pytorch的GPU版本

前言&#xff1a; 距离第一次安装深度学习的GPU环境已经过去了4年多&#xff08;当时TensorFlow特别麻烦&#xff09;&#xff0c;现在发现安装pytorch的GPU版本还是很简单方便的&#xff0c;流程记录如下。 安装步骤&#xff1a; 步骤一&#xff1a;官网下载Anaconda Free…

Threejs里执行对象的多个动画

承接上文&#xff0c;本文讲述如何在Threejs里播放对象的多个动画&#xff0c;这也是研究了很久才解决的… 一 导出模型 在Blender里按照File->Export&#xff0c;选择glTF2.0 然后在弹框的右上角选择导出为glTF Embedded (.gltf) 这样就把模型导出来了&#xff0c;该模…

docker部署nginx,部署springboot项目,并实现访问

一、先部署springboot项目 1、安装docker&#xff1a; yum install docker -y 2、启动docker&#xff1a; service docker start 重启&#xff1a; service docker restart 3、查看版本&#xff1a; docker -v 4、使设置docker.service生效&#xff08;路径&#xff1a;…

qt第二天

#include "widget.h" #include "ui_widget.h" #include "QDebug" Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->resize(QSize(800,600)); //使用匿名对象&#xff0c;调用重…