前言
可是雪~ 今日暴雪,南方孩子跑出去玩了。尽量多刷题多思考,不要满足于每天两道的任务。
内容
一、赎金信
给你两个字符串:ransomNote
和 magazine
,判断 ransomNote
能不能由 magazine
里面的字符构成。
如果可以,返回 true
;否则返回 false
。
magazine
中的每个字符只能在 ransomNote
中使用一次。
字符统计
在本题的情况下,使用map的空间消耗要比数组大一些的,因为map要维护红黑树或者哈希表,而且还要做哈希函数,是费时的!数据量大的话就能体现出来差别了。 所以数组更加简单直接有效!
//为了实现高效的查找和访问,map通常会使用哈希表或红黑树等数据结构来存储键值对。
func canConstruct(ransomNote string, magazine string) bool {
//m:=map[rune]int{}
m:=make([]int,26)
for _,v:=range magazine{
m[v-'a']++
}
for _,v:=range ransomNote{
m[v-'a']--
if m[v-'a']<0{
return false
}
}
return true
}
二、三数之和
给你一个整数数组 nums
,判断是否存在三元组 [nums[i], nums[j], nums[k]]
满足 i != j
、i != k
且 j != k
,同时还满足 nums[i] + nums[j] + nums[k] == 0
。请
你返回所有和为 0
且不重复的三元组。
注意:答案中不可以包含重复的三元组。
排序 + 双指针
func threeSum(nums []int) [][]int {
n:=len(nums)
sort.Ints(nums)
ans:=make([][]int,0)
// 枚举 a
for first:=0;first<n;first++{
// 需要和上一次枚举的数不相同
if first>0&&nums[first]==nums[first-1]{
continue
}
// c 对应的指针初始指向数组的最右端
third:=n-1
target:=-1*nums[first]
// 枚举 b
for second:=first+1;second<n;second++{
// 需要和上一次枚举的数不相同
if second>first+1&&nums[second]==nums[second-1]{
continue
}
// 需要保证 b 的指针在 c 的指针的左侧
for second<third&&nums[second]+nums[third]>target{
third--
}
// 如果指针重合,随着 b 后续的增加
// 就不会有满足 a+b+c=0 并且 b<c 的 c 了,可以退出循环
if second==third{
break
}
if nums[second]+nums[third]==target{
ans=append(ans,[]int{nums[first],nums[second],nums[third]})
}
}
}
return ans
}
最后
加油!