算法练习-第五天【哈希表】

哈希表

242.有效的字母异位词

参考:代码随想录242.有效的字母异位词

看完题目的第一想法

本题最直接的做法就是两层for循环,暴力解题,时间复杂度O(\(n^2\))。
因为题目只包含小写字母,那么可以通过一个大小为26的数组来解决。

  1. 数组的每一位存储一个小写字母,先遍历s每出现一个单词就令数组对应位置加1
  2. 再遍历t每出现一个单词就令数组对应位置减一
  3. 最后遍历数组,如果是异位词数组中的所有数字都应该是0,反之则不是。
func isAnagram(s string, t string) bool {
	m := [26]int{}
	for _, ss := range s {
		m[ss-'a']++
	}

	for _, tt := range t {
		m[tt-'a']--
	}

	for _, v := range m {
		if v != 0 {
			return false
		}
	}

	return true
}

本题收获

简单题, 看到题目就想到了使用哈希表来求解。

349. 两个数组的交集

参考:代码随想录349,两个数组的交集

看完题目的第一想法

简单题重拳出击
本题是求2个数组的交集,即nums1中存在的元素nums2中也存在,可以使用哈希表的方式来解决。因为本题没有限制题目的数值大小,因此无法像题目242一样使用数组代替哈希表。
注意输出结果需要数值唯一,可以使用键值分别为intbool作为哈希表的键值对;

func intersection(nums1 []int, nums2 []int) []int {
	m := make(map[int]bool)
	rlt := []int{}
	for _, num := range nums1 {
		m[num] = true
	}
	for _, num := range nums2 {
		if v, ok := m[num]; ok && v {
			m[num] = false // 遍历过了这个数值,因此标记成false
			rlt = append(rlt, num)
		}
	}

	return rlt
}

本题收获

一道比较简单的使用哈希表解决的问题,需要注意的是对输出结果数值唯一的处理

202.快乐数

参考:代码随想录202.快乐数

看完题目的第一想法

本题的解法在题目的描述中已经告诉了,需要考虑的是:

  1. 当求出的和是以前出现过的计算结果的时候就退出循环。
  2. 求一个数每个位上和的办法。
func isHappy(n int) bool {
	var getSum func(int) int
	getSum = func(num int) (sum int) {
		for num > 0 {
			sum += (num % 10) * (num % 10)
			num /= 10
		}

		return
	}
	m := make(map[int]struct{})
	for {
		rlt := getSum(n)
		if rlt == 1 {
			return true
		}

		if _, ok := m[rlt]; ok {
			return false
		}
		m[rlt] = struct{}{}
		n = rlt
	}
}

本题收获

  1. 注意循环退出的条件是出现了重复数字,使用哈希表来存储计算过的数字
  2. 计算一个数各个位上的和

1.两数之和

参考:代码随想录1.两数之和

看完题目的第一想法

求两个数之和,很明显可以使用暴力解法两层for循环,时间复杂度O(\(n^2\))。
本题是求数组中哪2个数的和为target

  1. 使用哈希表记录已经遍历过的数值,key为数值,value为数组下标
  2. 每次遍历的时候记当前的值为v,下标为i,可以到哈希表中匹配 target-v是否存在
  3. 如果存在,哈希表中的value值和当前值的下标i为答案
  4. 如果不存在,就将当前的值v与下标i记录到哈希表中
func twoSum(nums []int, target int) []int {
	m := make(map[int]int)

	for i, v := range nums {
		if vv, ok := m[target-v]; ok {
			return []int{vv, i}
		}
		m[v] = i
	}

	return nil
}

本题收获

算法中经常会使用到空间换时间的方式来降低时间复杂度

posted @ 2022-09-26 23:19  neil_liu  阅读(254)  评论(0)    收藏  举报