Leetcode 热门百题斩(第三天)

介绍

针对leetcode的热门一百题,解决大多数实习生面试的基本算法题。通过我自己的思路和多种方法,供大家参考。 

1.两数之和(题号:1)

方法一 

最先想到的就是两个for去遍历匹配。

class Solution {public int[] twoSum(int[] nums, int target) {for(int i = 0; i < nums.length; i++)for(int j = i + 1; j < nums.length; j++) {if(nums[i] + nums[j] == target) {return new int[] {i, j};}}return null;}
}

效率低下。

尝试其他方法。

 方法二

 使用Hash表进行匹配。也是先进行一次遍历,任何直接使用containKey匹配符合条件的值。

class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> numMap = new HashMap<>();//在为map赋值的时候顺便进行判断//判断当前map中是否存在其他key2可以得到当前key1相加等于targetfor(int i = 0; i < nums.length; i++) {if(numMap.containsKey(target - nums[i])) {//存在直接返回数据即可,此时是没有包含本身值 + 本身值是否=targetreturn new int[] {i, numMap.get(target - nums[i])};}numMap.put(nums[i], i);}return new int[2];}
}

效率马上就高了。

2. 字符异位词分组(题号:49)

方法一(暴力法,超时)

创建标记数组(标记数组是否被使用),通过二次遍历,将符合添加的数据存储到一个list中,最终返回数据。 

class Solution {public List<List<String>> groupAnagrams(String[] strs) {//创建一个标记数组int[] sign = new int[strs.length];List<List<String>> result = new LinkedList<>();//遍历列表并将重排序后相同的字符串存放在一个list中for(int i = 0; i < strs.length; i++) {//直接跳过if(sign[i] == 1) {continue;}//创建异位listList<String> tempList = new LinkedList<>();tempList.add(strs[i]);//对当前的字符串进行重排序char[] firstArray = strs[i].toCharArray();//直接对引用数组进行排序Arrays.sort(firstArray);String firstSortTemp = new String(firstArray);//将当前字符串标记为已使用(0为未使用,1为已使用)sign[i] = 1;for(int j = i + 1; j < strs.length; j++) {//对后续的字符串进行重排序if(sign[j] == 1) {//直接跳过continue;}char[] secondArray = strs[j].toCharArray();Arrays.sort(secondArray);String secondSortTemp = new String(secondArray);if(firstSortTemp.equals(secondSortTemp)) {//符合条件放入list中tempList.add(strs[j]);//标记为已使用sign[j] = 1;}}result.add(tempList);}return result;}
}

超时。

 方法二(使用hash表进行匹配)

使用hash表,对每个字符串重新排序,key存储排序后的字符串,value存储的就是符合异位的字符串的集合,最终返回values的集合。

class Solution {public List<List<String>> groupAnagrams(String[] strs) {//使用hash表进行匹配,key存储排序后的字符串,vlaue存储的就是异位字符串的list //(有点类似插入排序, 将对应的字符串存储到对应的键值对上)Map<String, List<String>> resultMap = new HashMap<>();for(int i = 0; i < strs.length; i++) {char[] tempStr = strs[i].toCharArray();Arrays.sort(tempStr);//排序好的字符串String sortTemp = new String(tempStr);List<String> tempList = resultMap.getOrDefault(sortTemp, new LinkedList<String>());//插入自己,并修改对应listtempList.add(strs[i]);resultMap.put(sortTemp, tempList);}//直接返回value集合return new LinkedList<List<String>>(resultMap.values());}
}

通过。

3.最长连续序列(题号:128)

最开始的时候题目要求将时间复杂度控制在O(N),就没有想到使用双重循环(主要是怕超时)。

主要的思路就是使用set去重,然后遍历,从每个连续序列的排头进行遍历判断,求出最长的序列长度。(要注意的就是,去除多余循环的次数,防超时)

class Solution {public int longestConsecutive(int[] nums) {//使用HashSet去重Set<Integer> set = new HashSet<Integer>();for(int i = 0; i < nums.length; i++) {set.add(nums[i]);}int maxSize = 0;for(int i = 0; i < nums.length; i++) {//判断当前数值是否为排头,如果是排头就将长度设置为1,反之直接跳过int currentSize = 0;int tempNum = nums[i];//判断是否存在前值,如果存在直接跳过,防止超时if(!set.contains(tempNum - 1)) {//不存在,就说明是排头currentSize = 1;//循环判断后续长度while(set.contains(tempNum + 1)) {currentSize++;tempNum++;}maxSize = Math.max(currentSize, maxSize);}}return maxSize;}
}

 执行通过。

4.移动零(题号:283)

第一时间想到的是使用双指针进行数值的移动,当时涉及到大量的移动操作,效率非常低下,因此直接新建一个数组进行操作。

class Solution {public void moveZeroes(int[] nums) {int[] result = new int[nums.length];int point = 0;for(int i = 0; i < nums.length; i++) if(nums[i] != 0) result[point++] = nums[i];for(int i = 0; i < nums.length; i++) nums[i] = result[i];}
}

 运行通过。

5.盛最多水的容器(题号:11)

在开始的时候就是想到使用两重遍历来解决,但是最后发现会超时。

class Solution {public int maxArea(int[] height) {int maxSize = 0;for(int i = 0; i < height.length; i++) {//对每条边进行遍历for(int j = i + 1; j < height.length; j++) {int len = Math.min(height[i], height[j]);int currentSize = len * (j - i);maxSize = (maxSize < currentSize) ? currentSize : maxSize;}}return maxSize;}
}

执行超时。

接着开始考虑其他方法,使用双指针来解决,左右向中间进行遍历,小的一侧向内移动。成功解决。 
 

class Solution {public int maxArea(int[] height) {int maxSize = 0;//使用双指针,两个指针分别左右进行压缩int first = 0, second = height.length - 1;while(first < second) {int currentLen = Math.min(height[first], height[second]);int currentSize = currentLen * (second - first);maxSize = (currentSize > maxSize) ? currentSize : maxSize;//小的一方就往内移一格if(height[first] > height[second]) {second--;} else {first++;}}return maxSize;}
}

执行通过。

6.三数之和(题号:15)

最开始的时候想到使用深度优先搜索,但是运行超时了。

class Solution {Set<List<Integer>> result = new HashSet<>();public List<List<Integer>> threeSum(int[] nums) {for(int mid = 0; mid < nums.length; mid++) {check(0, mid, nums.length - 1, nums);}return new LinkedList<List<Integer>>(result);}public void check(int i, int j, int k, int[] nums) {if(i == j || i == k || j == k || i >= nums.length || k < 0) {return ;}if(nums[i] + nums[j] + nums[k] == 0) {List<Integer> newSum = new LinkedList<>();newSum.add(nums[i]);newSum.add(nums[j]);newSum.add(nums[k]);Collections.sort(newSum);result.add(newSum);}//向下遍历check(i + 1, j, k, nums);check(i, j, k - 1, nums);}
}

运行超时。

 所以我们还是需要使用双指针,通过对一个数值作为target,其他两个来凑这个target,从而找到三数,通过双指针来控制和的大小,注意要进行去重。

class Solution {public List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);List<List<Integer>> result = new LinkedList<>();//第一位数值作为目标值,且要小于0,这样才存在三数和for(int targetIndex = 0; targetIndex < nums.length - 2; targetIndex++) {if(nums[targetIndex] > 0) {break;}if(targetIndex > 0  && nums[targetIndex] == nums[targetIndex - 1]) {continue;}int i = targetIndex + 1, j = nums.length - 1;while(i < j) {int tempSum = nums[i] + nums[j] + nums[targetIndex];if(tempSum > 0) {//j后退一个,且要去重while(i < j && nums[j] == nums[--j]);} else if(tempSum < 0) {//i前进一个,且要去重while(i < j && nums[i] == nums[++i]);} else {result.add(new LinkedList<Integer>(Arrays.asList(nums[targetIndex], nums[i], nums[j])));//j后退一个,且要去重while(i < j && nums[j] == nums[--j]);//i前进一个,且要去重while(i < j && nums[i] == nums[++i]);}}}return result;}
}

运行通过。

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

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

相关文章

进程中线程使用率偏高问题排查

1. top命令查看CPU使用率高的进程 2. top -H -p 15931(进程PID) 查看进程下的线程 3. printf "%x\n" 17503(线程PID) 线程PID 10进制转16进制 0x445f 4. jstack -l 15931(JVM进程PID) 导出java进程栈信息&#xff0c;里面包含线程nid0x445f和所在的类&#xff0…

ansible的常用模块配置说明及批量部署服务

ansible的常用模块配置说明及批量部署服务 ansible的常用模块配置说明&#xff0c;在远程服务器批量配置清华大学的仓库文件&#xff0c;批量部署nginx&#xff0c;并启动服务。 ansible知识点&#xff1a; 一、Ansible特点&#xff1a; 1、部署简单&#xff0c;只需在主控端…

生物发酵展同期论坛|2024节能环保绿色低碳发展论坛

“十四五”规划中提出&#xff0c;提高工业、能源领城智能化与信息 化融合&#xff0c;明确“低碳经济”新的战略目标&#xff0c;热能产业是能源产 业和民生保障的重要组成部分&#xff0c;也是二氧化碳排放量大的行业 之一&#xff0c;产业高效、清洁、低碳、灵活、智能化水平…

Rust 第一个rust程序Hello Rust️

文章目录 前言一、vscode 安装rust相关插件二、Cargo New三、vscode调试rustLLDB 前言 Rust学习系列。今天就让我们掌握第一个rust程序。Hello Rust &#x1f980;️。 在上一篇文章我们在macOS成功安装了rust。 一、vscode 安装rust相关插件 以下是一些常用的 Rust 开发插件…

Docker基础与持续集成

docker 基础知识&#xff1a; docker与虚拟机 !左边为虚拟机&#xff0c;右边为docker环境 – Server :物理机服务器Host OS &#xff1a;构建的操作系统Hypervisor &#xff1a;一种虚拟机软件&#xff0c;装了之后才能虚拟化操作系统Guest OS &#xff1a;虚拟化的操作系统…

AI应用开发-git开源项目的一些问题及镜像解决办法

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

python爬虫之豆瓣首页图片爬取

网址&#xff1a;https://movie.douban.com/ import requests from lxml import etree import re url https://movie.douban.com headers {User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.289 Safari/5…

小埋的解密游戏的题解

题目描述 小埋最近在玩一个解密游戏&#xff0c;这个游戏的解密方法是这样的&#xff0c;这个游戏会给你提供 个数,让我们求出这 个数里面&#xff0c;有多少个连续的数的平均数大于某个给定的数 。这个数可能会很大&#xff0c;所以我们要输出这个数对 的取模结果。现在小…

【脑电信号处理与特征提取】P7-涂毅恒:运用机器学习技术和脑电进行大脑解码

运用机器学习技术和脑电进行大脑解码 科学研究中的大脑解码 比如2019年在Nature上一篇文章&#xff0c;来自UCSF的Chang院士的课题组&#xff0c;利用大脑活动解码语言&#xff0c;帮助一些患者恢复语言功能。 大脑解码的重要步骤 大脑解码最重要的两步就是信号采集和信号…

Pycharm 关闭/退出烦人的Pytest模式

Pycharm 遇到&#xff1a;Run Python tests in ***.py &#xff0c;但很多时候我们并不需要&#xff0c;真心烦人&#xff01; 如何解决: 1 打开File-Settings &#xff08;图片是新版界面&#xff0c;旧版同样操作&#xff09; 2 Tools 中的Python Integrated Tools 在Tes…

impala与kudu进行集成

文章目录 概要Kudu与Impala整合配置Impala内部表Impala外部表Impala sql操作kuduImpala jdbc操作表如果使用了Hadoop 使用了Kerberos认证&#xff0c;可使用如下方式进行连接。 概要 Impala是一个开源的高效率的SQL查询引擎&#xff0c;用于查询存储在Hadoop分布式文件系统&am…

新开发板-正点原子的rk3568

有好长一段时间没有更新博客了&#xff0c;上次更新还是在上次...哈哈开个玩笑&#xff0c;上次stm32f407的定时器还没写完&#xff0c;就备战期末去了&#xff08;电信学院&#xff0c;你懂的&#xff09;&#xff0c;一直没更新&#xff0c;原因是我实习去了&#xff0c;在忙…