当前位置: 首页 > news >正文

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];}
}

 运行通过。

相关文章:

  • 09. 配置Eth-Trunk
  • Python爬虫-批量爬取免费小说并下载保存到本地
  • C++笔记(七)
  • 前缀和 差分
  • 05 - 什么是路由协议
  • 数据结构—动态查找
  • 第十章 函数 (上)第一节-第九节
  • 宠物处方单子怎么开,宠物门诊处方管理软件教程
  • JVM 笔记
  • 常见的网络安全威胁和防护方法
  • C++——构造函数
  • Android使用ScrollView导致鼠标点击事件无效
  • LeetCode 热题 100 | 链表(上)
  • 解决Docker AList本地挂载失效的问题。
  • 免费电视TV盒子软件,好用的免费电视盒子软件大全,免费电视盒子APP大全,2024最新整理
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • Centos6.8 使用rpm安装mysql5.7
  • MySQL的数据类型
  • Python打包系统简单入门
  • Ruby 2.x 源代码分析:扩展 概述
  • 对JS继承的一点思考
  • 我的zsh配置, 2019最新方案
  • 鱼骨图 - 如何绘制?
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • #AngularJS#$sce.trustAsResourceUrl
  • #Java第九次作业--输入输出流和文件操作
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (四)linux文件内容查看
  • (图)IntelliTrace Tools 跟踪云端程序
  • (转)jQuery 基础
  • (转)可以带来幸福的一本书
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .net mvc 获取url中controller和action
  • .net 发送邮件
  • .Net 高效开发之不可错过的实用工具
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NET4.0并行计算技术基础(1)
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .skip() 和 .only() 的使用
  • [ C++ ] STL---stack与queue
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [AutoSAR系列] 1.3 AutoSar 架构
  • [BUUCTF 2018]Online Tool(特详解)
  • [CLickhouse] 学习小计
  • [iOS]iOS获取设备信息经常用法
  • [iOS]如何删除工程里面用cocoapods导入的第三方库
  • [IT生活推荐]大家一起来玩游戏喽,来的都进!
  • [Java并发编程实战] 共享对象之可见性
  • [leetcode]56. Merge Intervals归并区间
  • [NAND Flash 6.1] 怎么看时序图 | 从时序理解嵌入式 NAND Read 源码实现