首页 > 其他分享 >Leetcode刷题day5-哈希表.异位词.交集.快乐数.两数和

Leetcode刷题day5-哈希表.异位词.交集.快乐数.两数和

时间:2023-12-04 10:14:08浏览次数:37  
标签:return target nums day5 dict 哈希 table 两数

242.有效的字母异位词

242. 有效的字母异位词 - 力扣(LeetCode)
给定两个字符串 _s_ 和 _t_ ,编写一个函数来判断 _t_ 是否是 _s_ 的字母异位词。
注意: 若 _s_ 和 _t_ 中每个字符出现的次数都相同,则称 _s_ 和 _t_ 互为字母异位词。

  • 示例 1:
    • 输入: s = "anagram", t_= "nagaram"
    • 输出: true
  • 示例 2:
    • 输入:_ = "rat", t = "car"
    • 输出: false

解题思路:
1. 排序法:sort两个字符串,直接判断是否相等
2. 哈希表-字典:两个dict,分别存储两个字符串中的不同字母数量,判断dict是否相等
3. 哈希表-列表:一个长度为26, 元素值全为0的list,先通过ASCII码对一个字符串元素,在列表对应位置元素的数值累加,再对另一个字符串元素在该列表中数值累减

class Solution():
	def isAnagram(s,t):  # 排序法
		new_s = sorted(s)
		new_t = sorted(t)
		if new_s == new_t:
			return True
		return False
		
	def isAnagram(s,t):  # 哈希表-字典
		dict_s = {}
		dict_t = {}
		for w in s:
			if w in dict_s:
				dict_s[w]+=1
			else:
				dict_s[w]=1
		for w in t:
			if w in dict_t:
				dict_t[w]+=1
			else:
				dict_t[w]=1
		if dict_s == dict_t:
			return True
		return False

	def isAnagram(s,t):  # 哈希别-列表
		res = [0]*26
		for w in s:
			res[ord(w)-ord('a')]+=1
		for w in t:
			res[ord(w)-ord('a')]-=1
		for i in res:
			if i!=0:
				return False
		return True

349.两个数组的交集

349. 两个数组的交集 - 力扣(LeetCode)
给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

  • 示例 1:
    • 输入:nums1 = [1,2,2,1], nums2 = [2,2]
    • 输出:[2]
  • 示例 2:
    • 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
    • 输出:[9,4] or [4,9]

解题思路:
1. 暴力求解:遍历nums2,判断每个元素是否在nums1中
2. 哈希表-集合:使用set(),求交集
3. 哈希表-字典/列表+集合:先创建nums1哈希表,再遍历nums2判断元素是否在哈希表

class Solution():
	def intersection(nums1,nums2):  # 暴力求解
		res = []
		for n in nums2:
			if n in nums1 and n not in res:
				res.append(n)
		return res

	def intersection(nums1,nums2):  # 哈希表-集合求交集
		return list(set(nums1)&set(nums2))

	def intesection(nums1,nums2):  # 哈希表-字典+集合
		table = {} # 字典查询似乎更快?
		for n in nums1:
			table[n] = table.get(n,0) + 1

		res = set()
		for n in nums2:
			if n in table:
				res.add(n)
		return list(res)

202.快乐数

202. 快乐数 - 力扣(LeetCode)
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。
    如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
  • 示例 1:
    • 输入:n = 19
    • 输出:true
    • 解释:
      1^2 + 9^2 = 82
      8^2 + 2^2 = 68
      6^2 + 8^2 = 100
      1^2 + 0^2 + 0^2 = 1
  • 示例 2:
    • 输入:n=2
    • 输出:false

解题思路:
无限循环条件:计算过程,必然会出现相同的数

class Solution():
	def isHappy(n):
		table = {}
		while n!=1:
			if n in table:
				return False
			table[n] = 1
			n = sum([int(i)**2 for i in str(n)])
		return True

1.两数之和

1. 两数之和 - 力扣(LeetCode)
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。

  • 示例 1:
    • 输入:nums = [2,7,11,15], target = 9
    • 输出:[0,1]
    • 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
  • 示例 2:
    • 输入:nums = [3,2,4], target = 6
    • 输出:[1,2]
  • 示例 3:
    • 输入:nums = [3,3], target = 6
    • 输出:[0,1]

解题思路:
1. 暴力求解:双循环,两数相加==target
2. 哈希表:判断target-num是否在table出现过,若出现返回table[target-num]和当前id;否则,table[num]=id

class Solution():
	def twoSum(nums,target):  # 暴力求解
		for i in range(len(nums)):
			for j in range(i+1,len(nums)):
				if nums[i]+nums[j]==target:
					return [i,j]
		return None


	def twoSum(nums,target):  # 哈希表
		table = {}
		for id,num in enumerate(nums):
			if target-num in table:
				return [table[target-num],id]
			table[num]=id
		return None

标签:return,target,nums,day5,dict,哈希,table,两数
From: https://www.cnblogs.com/lzj2023/p/17874295.html

相关文章

  • [LeetCode Hot 100] LeetCode1. 两数之和
    题目描述思路:如果哈希表存在target-nums[i],则返回索引下标i和对应的key值(可以按任意顺序返回答案)如果哈希表中不存在target-nums[i],则存入nums[i]和对应的索引值方法一:哈希表classSolution{publicint[]twoSum(int[]nums,inttarget){//1.存放......
  • ABC 331 F - Palindrome Query(字符串哈希,树状数组)
    字符串哈希[OI-Wiki](字符串哈希-OIWiki(oi-wiki.org))分为两种哈希方式:以左为高位和以右为高位如果只是快速查询每个字串的哈希值,用以左为高位比较简单,即\[Hash[l...r]=Hash[1...r]-Hash[1...(l-1)]\timesbase^{r-l+1}\]但是如果有修改操作,需要将每一位的Hash值存......
  • day5
    day5black-java学习二维数组格式1数据类型[][]变量名=new数据类型[m][n]m表示这个二维数组有多少个一维数组n表示每一个一维数组的元素个数举例:int[][]arr=newint[3][2];定义了一个二维数组arr这个二维数组有3个一维数组,名称是arr[],arr[1],arr......
  • 代码随想录-哈希
    242.有效的字母异位词https://leetcode.cn/problems/valid-anagram/description/classSolution{public:boolisAnagram(strings,stringt){if(s.size()!=t.size())returnfalse;inthash[26]={0};for(inti=0;i<s.size......
  • 哈希表
    哈希表引入哈希表又称散列表,一种以「key-value」形式存储数据的数据结构。所谓以「key-value」形式存储数据,是指任意的键值key都唯一对应到内存中的某个位置。只需要输入查找的键值,就可以快速地找到其对应的value。可以把哈希表理解为一种高级的数组,这种数组的下标可以是很......
  • 两数之和
    梦开始的地方,两数之和巧妙之处在于value做key,idx做val可能会问:如果value冲突的?即两个一样的值首先这是两数和问题:如果这两个重复的数正好被选上,那么一个记录在map中,一个未记录,没问题如果只是一个数倍选上,那么map中的记录会被后续出现的重复数更新,但并不影响(题设有说明)impo......
  • P3370 【模板】字符串哈希(普及−) 题解
    题目链接题目大意如题,给定\(N\)个字符串(第\(i\)个字符串长度为\(M_i\),字符串内包含数字、大小写字母,大小写敏感),请求出\(N\)个字符串中共有多少个不同的字符串。不知道大家知不知道一个字符串函数,叫\(insert\)他是\(STL\)库中的一个函数,作用是将两个字符串拼接起来,我......
  • 字符串哈希
    字符串哈希字符串哈希就是将一个字符串映射为P进制的整数.将一个字符串映射成一个P进制整数对于一个长度为n的字符串s,这样定义一个Hash函数:\(h(s)=\sum_{i=1}^{n}s[i]\timesp^{n-i}(modM)\)例如,字符串,abc,其哈希值为\(ap^2+bp^1+c\)如果两个字符串不一样,哈希值......
  • 浅谈字符串哈希 入门
    基本介绍字符串哈希的主要思路是这样的:首先选定一个进制\(P\),对于一个长度为\(N\)的字符串\(S\)的所有\(i(1\leqi\leqn)\)的\(S_1,S_2,...,S_i\)子串表示成\(P\)进制的值预处理记录下来。这样判断\(S_i,S_{i+1},...,S_{i+m-1}\)和\(T_1,T_2,...,T_m\)是否相等......
  • 13--2. 两数相加
    【首先,题目是给了两个链表,我们可以直接使用哦】我们要自己创建一个链表来存储结果//将第一个节点的值初始化为0,用来指向头指针(意思就是pre后面的那个值才是头指针),返回结果LinkNodepre=newLinkNode(0);//cur是一个可移动的指针,作为储存两个数之和的位置LinkNodecur=......