两数之和
题目:
给定一个整数数组 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 []
}
字母异位词分组
题目:
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
解题思路:
- 遍历字符串数组,将其排序后
- 将其排序后的字符串作为key,将其本身作为key的一个值存入字典
- 遍历结束得到的字典,则是所有异位词的字典,将其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) **的算法解决此问题。
解题思路:
- 利用set去重
- 对nums遍历,取得值后利用set的remove方法移除当前值,如果没有则continue,继续下一次循环
- 再在set里面找比自己小的值,找到则减1继续找,直到没有,则记录一次小于自己的连续值
- 再在set里面找比自己大的连续值,找到则加1继续找,直到没,则记录一次大于自己的连续值,
- 再和之前的连续值比对,得到最大连续值;
- 继续下一次循环,直到末尾,返回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
}