算法:哈希
一、两数之和
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]
示例2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例3:
输入:nums = [3,3], target = 6
输出:[0,1]
题解:
给定一个数组,首先想到的是两次for循环,第一次for循环时拿到第一个元素,第二次for循环时拿到后面的元素,进行判断第一个元素和后面的元素加起来是否是目标值,是则添加到新数组中。
var twoSum = function(nums, target) { |
二、字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
题解:
计数方法
由于互为字母异位词的两个字符串包含的字母相同,因此两个字符串中的相同字母出现的次数一定是相同的,故可以将每个字母出现的次数使用字符串表示,作为哈希表的键。
由于字符串只包含小写字母,因此对于每个字符串,可以使用长度为 26 的数组记录每个字母出现的次数。
var groupAnagrams = function(strs) { |
三、最长连续序列
给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n)
的算法解决此问题。
示例1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例2:
输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9
题解:
将数组元素存入 set 中
遍历nums
,如果 当前项 - 1 存在于 set ,说明当前项不是连续序列的起点,忽略,继续遍历
如果当前项没有“左邻居”,它就是连续序列的起点,循环查看当前项连续的右邻居有多少个
返回最长的连续次数
此方法的时间复杂度为O(n)
var longestConsecutive = function (nums) { |
先将数组排序,设置计数器等于1,最长连续计数器等于1,如果数组的长度为0,则返回0,遍历数组,如果数组的第一个和他后面的一个值相同,就继续比较,类似 Set
方法,如果数组前一个值加一等于下一个的值,count就加一,否则重置计数器为1,每当遍历完一次回合都要更新一次 maxCount
计数器,将最长序列存储,遍历完成后,返回最长序列的长度
时间复杂度为O(nlogn)
var longestConsecutive = function(nums) { |