LeetCode热题解析

60 阅读2分钟

两数之和

题目:

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

解题思路:
func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
        var dict = Dictionary<Int, Int>.init()
        for index in 0..<nums.count {
            //判断当前数字的差是否已入字典
            //1. 已入则找到结果直接返回,两个小标即可
            //2. 如果未入,则将自身的值作为key,下标作为value,存入字典
            if dict.keys.contains(target - nums[index]) {
                return [dict[target - nums[index]]!,index]
            }
            dict[nums[index]] = index
        }
        return []
    }

字母异位词分组

题目:

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

解题思路:
  1. 遍历字符串数组,将其排序后
  2. 将其排序后的字符串作为key,将其本身作为key的一个值存入字典
  3. 遍历结束得到的字典,则是所有异位词的字典,将其key对应的value加入数组即可
func groupAnagrams(_ strs: [String]) -> [[String]] {
   var dict = [String:[String]]()
   /*
   1. 将每一个字符串排序
   2. 将其排序后的字符串作为key,将其本身作为key的一个值存入字典
   3. 得到的字典,则是所有异位词的字典,将其key对应的value加入数组即可
   */
   for str in strs {
       var list:[Character] = Array(str)
       list.sort()
       let key = list.reduce(into: "") { partialResult, element in
           return partialResult += String(element)
       }
       if dict[key] == nil {
           dict[key] = []
       }
       dict[key]!.append(str)
   }
   var list:[[String]] = []
   for key in dict.keys {
       list.append(dict[key]!)
   }
   return list   

}

最长连续序列

题目:

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) **的算法解决此问题。

解题思路:
  1. 利用set去重
  2. 对nums遍历,取得值后利用set的remove方法移除当前值,如果没有则continue,继续下一次循环
  3. 再在set里面找比自己小的值,找到则减1继续找,直到没有,则记录一次小于自己的连续值
  4. 再在set里面找比自己大的连续值,找到则加1继续找,直到没,则记录一次大于自己的连续值,
  5. 再和之前的连续值比对,得到最大连续值;
  6. 继续下一次循环,直到末尾,返回max连续值
func longestConsecutive(_ nums: [Int]) -> Int {
   var maxCount = 0
   //过滤重复数据
   var set = Set.init(nums)
   for num in nums {
       if set.remove(num) != nil {
           var count = 1
           var currentNum = num
           //找比自己小的,找到就再减1继续找
           while set.remove(currentNum - 1) != nil {
               currentNum -= 1
           }
           //计算连续比自己小的连续数量
           count += num - currentNum
           //充值当前数据
           currentNum = num
           //找比自己大的,找到就再加1继续找
           while set.remove(currentNum + 1) != nil {
               currentNum += 1
           }
           //计算比自己大的连续数量
           count += currentNum - num
           //和之前找到的比对,得到最大的连续
           maxCount = max(count,maxCount)
       }
   }
   return maxCount
}