go语言leetcode训练 NO.387,NO.78

本文介绍了一种使用递归方法生成给定整数数组所有可能子集的算法,以及一种通过创建映射来寻找字符串中首个不重复字符及其索引的高效策略。这两种算法分别展示了树形数据结构的应用和字符频率统计的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

思路:利用递归,"形成树形图"

var  sonset  [][]int

func subsets(nums []int) [][]int {
       if len(nums)==0{
              return [][]int{[]int{}}
          }else{
              get_val([]int{},nums,0,len(nums))
              sonset = append(sonset,[]int{})
          }
       return sonset
}

func get_val(now,nums []int,intger,length int){
   for i:=intger;;i++ {
      if i+1 > length{
         return
      }
      new_sonset_em := make_sonset_em(now,nums[i])
      sonset = append(sonset,new_sonset_em)
      get_val(new_sonset_em,nums,i+1,length)
   }
}

func  make_sonset_em(now []int,val int)[]int  {
   return append(now,val)
}

 

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

思路:创建一个记录每一个不同字符的 第一次出现的位置 和 出现次数 的 映射 ,然后遍历筛选出 出现次数为1且最早出现的元素 位置 

type Locate_num struct {
   Locate int   //表示第一次出现的位置
   Num    int   //表示总共出现的次数
}
var one_char map[uint8]*Locate_num

func firstUniqChar(s string) int {
   one_char :=make(map[uint8]*Locate_num,len(s))
   first :=len(s)
   if len(s)==0{
      return -1
   }else{    //创建映射
      one_char[s[0]]=&Locate_num{0,1}
      for i:=1;i<len(s);i++ {
         _,ok := one_char[s[i]]
         if ok {
            one_char[s[i]].Num++
         }else{
            one_char[s[i]]=&Locate_num{i,1}
         }
      }
   }
   for _,val :=range one_char {   //筛选
      if val.Num==1&&first>val.Locate{
         first=val.Locate
      }
   }
   if first==len(s) {
      first=-1
   }
   return first

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值