首页 > 编程语言 >算法练习-第五天【哈希表】

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

时间:2022-09-26 23:34:43浏览次数:74  
标签:数组 int 算法 num 哈希 rlt 第五天 本题

哈希表

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
}

本题收获

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

标签:数组,int,算法,num,哈希,rlt,第五天,本题
From: https://www.cnblogs.com/neilliu/p/16732630.html

相关文章

  • 算法第二章心得
    1.请以伪代码描述最大字段和的分治算法将序列a[1:n]分成长度相等的两段a[1:n/2]和a[n/2+1:n],则a[1:n]的最大子段和有三中情形:在[1,n/2]内;在[n/2+1,n]内;在起点位于[1,n/2......
  • 华东师范大学算法课ACM——框体排列
    框体排列单点限制:1.0sec内存限制:512MB数轴上有n个点,每个点有一个坐标ai。现在需要用数个宽度为k的框体覆盖数轴上全部n个点,求出最少需要的框体数量。输入格式......
  • 常见距离算法
    机器学习中有很多的距离计算公式,用于计算数据和数据之间的距离,进而计算相似度或者其他。1.欧式距离(EuclideanDistance)​ 欧式距离是最常见的距离度量方法。小学、初......
  • 冒泡算法排序
    for(vari=0;i<arr.length;i++){    for(varj=0;j<arr.length-i;j++){        if(arr[j]>arr[j+1]){//            vartemp=arr[j]; ......
  • 15 -- 排序算法之选择排序
    选择排序的思想:选择排序(selectsorting)也是一种简单的排序方法,它的基本思想是:第一次排序从arr[0]~arr[n-1]中选取最小值,与arr[0]交换,第二次排序从arr[1]~arr[n-1]中......
  • 二、目标检测算法之R-CNN
    二、目标检测算法之R-CNN1、R—CNN发展过程和各自的优缺点1.1R-CNN(1)R-CNN原理通过滑动窗口来检测不同的目标类型(从左到右、从上到下滑动窗口,利用分类识别目标),我们使用......
  • 海外某音x-gorgon算法原理分析及算法源码公布
    算法源码见附件分享一个去年逆的一个海外版某音1474版本x-gorgon算法,这里简单介绍一下算法原理,首先malloc出来一个0x1A大小的空间,然后截取用户传入的byte数组中的参数,截......
  • 哈希算法(上)
    目录什么是哈希算法?应用一:安全加密应用二:唯一标识应用三:数据校验内容小结什么是哈希算法?不管是“散列”还是“哈希”,这都是中文翻译的差别,英文其实就是“Hash”。所以,我......
  • 密码学算法技巧
    2.6密码学算法技巧2.6.1Hash算法1)简介:Hash算法(又称散列算法、散列函数、哈希算法)是把任意长度的输入通过散列算法变成固定长度的输出,且不可逆的单向密码机制。Hash算法是......
  • 哈希表
    用于给一个元素,判断其有没有在集合中出现过字符串的对应代码constbase="a".charCodeAt();//遍历s遇到相同字符在哈希数组中做++for(leti=0;i<s.......