Chimission's Notes

Leetcode 哈希篇

2022-11-03

做题的一些笔记 hash篇

454. 四数相加 II

这道题虽然想到了hash可以降低复杂度,但是没有想到可以分组,AB一组,CD一组。题解将4层for循坏利用分组+hash拆解成两层for循环。hash表将AB和作为key,将AB和出现的次数作为value。wiki:在寻找和的次数类似的题目时就要考虑能不能用hash降低复杂度。

func fourSumCount(nums1 []int, nums2 []int, nums3 []int, nums4 []int) int {
   result:=0
   countAB := make(map[int]int)
   for _, a := range(nums1){
       for _, b := range(nums2) {
           countAB[a+b] += 1
       }
   }
   for _, c := range(nums3) {
       for _, d:= range(nums4){
           result += countAB[0-c-d]
       }
   }
   return result
}

541. 反转字符串 II

第一遍单纯的模拟操作,导致代码写的很冗余,设计了很多计数器

func reverseStr(s string, k int) string {
   l := len(s)
   if l <=1 || k==0{
       return s
   }
   sByte := []byte(s) 
   flag := true
   for i:=0; i<l;i++{
       if i % k==0 {
           flag = true
       }
       if flag {
           start:=i
           end:=i+k-1
           if end > l-1 {
               end = l-1
           }
           for start < end {
               sByte[start] , sByte[end] = sByte[end], sByte[start]
               start += 1
               end -= 1
       }
       i=i+k
       flag = false  
   }
   }
   return string(sByte)
}

第二次看题解, 发现在循环的时候每次可以多循环几个元素,不用只加一

func reverseStr(s string, k int) string {
   sByte := []byte(s)
   l := len(s)
   for i :=0; i<l;i+= 2 * k{
       start := i
       end := i+k-1
       if end>l-1{
           end=l-1
       }
       for start < end {
           sByte[start], sByte[end] = sByte[end], sByte[start]
           start+=1
           end-=1
       }

   }
   return string(sByte)
}