LeetCode 热题 HOT 100(一)
前言
leetcode恢复刷题,十月底之前尽量完成这部分…该部分只简单记录部分关键思路以及代码,帮助回顾~
1. 两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
思路:HashMap
由于还需要返回数组下标,所以存的时候肯定还要存数组下标,那就需要存一个键值对。这种情况直接考虑HashMap~
1 | class Solution { |
2. 两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
1 | 输入:l1 = [2,4,3], l2 = [5,6,4] |
思路:直接模拟
这题可以直接模拟做出来,看了一个赞比较多的模拟方法,可以学习下
1 | /** |
3. 无重复字符的最长子串
给定一个字符串
s
,请你找出其中不含有重复字符的 最长子串 的长度。
1 | 输入: s = "abcabcbb" |
思路:滑动窗口+哈希表
用两个指针维护一个滑动窗口就可以解决问题,但这里写的时候遇到一个难点在于:更新left指针的时候要判断哈希表中获得的重复字符串位置可能在已经更新的left之前,这个时候就不用更新了。
1 | class Solution { |
4. 寻找两个正序数组的中位数
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
1
2
3 输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
思路:二分法
1 | public double findMedianSortedArrays(int[] nums1, int[] nums2) { |
5.最长回文子串
给你一个字符串 s
,找到 s
中最长的回文子串。
示例 1:
1 | 输入:s = "babad" |
思路:动态规划
1 | public class Solution { |
6.Z 字形变换
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:”PAHNAPLSIIGYIR”。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
思路:模拟
1 | class Solution { |
7. 整数反转
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
1 | 输入:x = 123 |
思路:取模、考虑溢出
1 | class Solution { |
8. 字符串转换整数 (atoi)
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
函数 myAtoi(string s) 的算法如下:
读入字符串并丢弃无用的前导空格
检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
将前面步骤读入的这些数字转换为整数(即,”123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
返回整数作为最终结果。
思路:自动机
1 | class Solution { |