Talk is cheap, show me your code.
1 两数之和
- 需要使用map,因为map时间复杂度为O(1)。
- map的key为值,map的value为数组的第几个
- 题目中说:数组中同一个元素在答案里不能重复出现。所以必须遍历时放进去。
func twoSum(nums []int, target int) []int {
// 使用map时间复杂度为1,key为值,value为index
m := map[int]int{}
for i, j := range nums {
need := target - j
// 只有不存在的时候才放入。
if v, ok := m[need]; ok {
return []int{i, v}
} else {
m[j] = i
}
}
return []int{}
}
总结:对时间复杂度要求严格,或者不会重复(要求或者自己认为),可以考虑是否用map
2 两数相加
- 链表,倒序加和
- 注意最后的进位即可,没什么好说的
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
now := 0
answer := ListNode{}
node := &answer
for l1 != nil || l2 != nil {
if l1 != nil {
now += l1.Val
l1 = l1.Next
}
if l2 != nil {
now += l2.Val
l2 = l2.Next
}
node.Next = &ListNode{Val: now%10}
node = node.Next
now /= 10
}
if now > 0 {
node.Next = &ListNode{Val: now%10}
}
return answer.Next
}
总结:简单链表
3 无重复字符的最长子串
- 双指针,滑动窗口
- 将窗口内不重复的元素用map存储下来
- 遇到重复的元素,把前指针后移,直到前指针的元素为后指针的元素,然后前指针再往前移一个
func lengthOfLongestSubstring(s string) int {
m := map[byte]int{}
now := 0
answer := 0
left := 0
for i, b := range s {
if _, ok := m[byte(b)]; !ok {
now++
if now > answer {
answer = now
}
m[byte(b)] = 1
} else {
for ; left != i; left++ {
if byte(b) == s[left] {
left++
break
}
delete(m, s[left])
now--
}
}
}
return answer
}
总结:简单双指针