Go语言解leetcode(五)

Go语言解leetcode(五),第1张

0. 简介

最近在学Go语言,但是没怎么练习,因此在leetcode上用Go语言刷算法题巩固一下Go基础。

1. 通配符匹配:44. 通配符匹配 - 力扣(LeetCode) (leetcode-cn.com)

解题思路:动态规划,具体思路可见这里。通配符匹配 - 通配符匹配 - 力扣(LeetCode) (leetcode-cn.com)

func isMatch(s string, p string) bool {
    lens := len(s)
    lenp := len(p)
    flag := make([][]bool,lens+1)
    for index:=0;index<=lens;index++{
        flag[index] = make([]bool,lenp+1)
    }
    flag[0][0] = true
    for index:=1;index<=lenp;index++{
        if(p[index-1]=='*'){
            flag[0][index]=flag[0][index-1]
        }
    }
    for i:=1;i<=lens;i++{
        for j:=1;j<=lenp;j++{
            if(s[i-1]==p[j-1]||p[j-1]=='?'){
                flag[i][j]=flag[i-1][j-1]
            }
            if(p[j-1]=='*'){
                flag[i][j]=flag[i-1][j]||flag[i][j-1]
            }
        }
    }
    return flag[lens][lenp]
}
2. 跳跃游戏II:45. 跳跃游戏 II - 力扣(LeetCode) (leetcode-cn.com)

解题思路:遍历数组中的每一个元素,同时记录维护两个变量,一个为index,一个为next,index和next都是记录下一步可以到达的最长步长,不同的是,next用来记录步长,index用来协助更新最少跳跃次数。

func jump(nums []int) int {
    var num int
    next := 0
    index := 0
    for i:=0;i<=len(nums);i++{
        if(index>=len(nums)-1){
            break
        }
        if(i+nums[i]>next){
            next=i+nums[i]
        }
        if(i==index){
            index=next
            num++
        }
    }
    return num
}
3. 全排列:46. 全排列 - 力扣(LeetCode) (leetcode-cn.com)

解题思路:递归回溯,同时使用bool数组协助记录当前的某个值是否已经被填入排列了。

func permute(nums []int) [][]int {
    flag := make([]bool,len(nums))
    ans := make([][]int,0)
    temp := make([]int,0)
    find(nums,&flag,&ans,temp)
    return ans
}

func find(nums[] int,flag *[]bool,ans *[][]int,temp []int){
    if len(temp)==len(nums){
        s := make([]int,len(temp))
        copy(s,temp)
        *ans = append(*ans,s)
        return
    }
    lens := len(nums)
    for index:=0;index<lens;index++{
        if !(*flag)[index]{
            temp = append(temp,nums[index])
            (*flag)[index]=true
            find(nums,flag,ans,temp)
            (*flag)[index]=false
            temp = temp[0:len(temp)-1]
        }
    }
}
4. 全排列II?47. 全排列 II - 力扣(LeetCode) (leetcode-cn.com)

解题思路:思路与上一题基本一致,需要考虑一点是怎么避免重复排列,这里一开始我只考虑了同一元素开头做重复排列的情况,只排除了一部分,还有一部分重复排列做结尾的情况没有考虑到,后面查看官方解法,具体原理还有待思考,关键部分代码为以下:

if (index>0&&nums[index]==nums[index-1]&&!(*flag)[index-1]){
    continue
}
func permuteUnique(nums []int) [][]int {
    flag := make([]bool,len(nums))
    ans := make([][]int,0)
    temp := make([]int,0)
    sort.Ints(nums)
    find(nums,&flag,&ans,temp)
    return ans
}

func find(nums []int,flag *[]bool,ans *[][]int,temp []int){
    if(len(temp)==len(nums)){
        s := make([]int,len(nums))
        copy(s,temp)
        *ans = append(*ans,s)
        return
    }
    lens := len(nums)
    for index:=0;index<lens;index++{
        if (index>0&&nums[index]==nums[index-1]&&!(*flag)[index-1]){
            continue
        }
        
        if !(*flag)[index]{
            temp = append(temp,nums[index])
            (*flag)[index]=true
            find(nums,flag,ans,temp)
            (*flag)[index]=false
            temp = temp[0:len(temp)-1]
        }
    }
}
5. 转换图像:48. 旋转图像 - 力扣(LeetCode) (leetcode-cn.com)

解题思路:以每一外圈为一个循环,如

1 2 3
4   6
7 8 9

在这里,1,3,9,7为一组,依次交换位置,2,6,8,4为一组,依次交换位置。需要确定的是组的数量,交换的起始位置,交换的终止位置,然后根据这些向内完成循环即可。

func rotate(matrix [][]int)  {
    lens := len(matrix)
    if lens==0{
        return 
    }
    move := lens-1
    start := 0
    end := lens-1
    for ;move>0;{
        for i:=0;i<move;i++{
            matrix[start][start+i],matrix[start+i][end],matrix[end][end-i],matrix[end-i][start]=matrix[end-i][start],matrix[start][i+start],matrix[start+i][end],matrix[end][end-i]
        }
        move = move-2
        start++
        end--
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/994860.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存