力扣刷题第十六天--哈希表篇

前言

可是雪~ 今日暴雪,南方孩子跑出去玩了。尽量多刷题多思考,不要满足于每天两道的任务。

内容

一、赎金信

383.赎金信

给你两个字符串: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
}
二、三数之和

15.三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != 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
}

最后

加油!

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值