从零开始的力扣刷题记录-第六十天

2481. 分割圆的最少切割次数-简单

题目描述:
圆内一个 有效切割 ,符合以下二者之一:
该切割是两个端点在圆上的线段,且该线段经过圆心。
该切割是一端在圆心另一端在圆上的线段。
给你一个整数 n ,请你返回将圆切割成相等的 n 等分的 最少 切割次数。

题解:
举两个例子就能发现规律,奇数等分需要切割的次数和等分数相等,偶数则除以二

代码(Go):

func numberOfCuts(n int) int {
    if n == 1 {
        return 0
    }
    if n % 2 == 0 {
        return n / 2
    }
    return n
}

2248. 多个数组求交集-简单

题目描述:
给你一个二维整数数组 nums ,其中 nums[i] 是由 不同 正整数组成的一个非空数组,按 升序排列 返回一个数组,数组中的每个元素在 nums 所有数组 中都出现过。

题解:
统计每个数字出现的次数,出现次数等于nums中数组数目的元素就是交集,再按顺序放入结果集即可

代码(Go):

func intersection(nums [][]int) []int {
    l := len(nums)
    arr := [1001]int{}
    for _,v := range nums{
        for _,value := range v{
            arr[value]++
        }
    }
    re := []int{}
    for i,v := range arr{
        if v == l{
            re = append(re,i)
        }
    }
    return re
}

62. 不同路径-中等

题目描述:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?

题解:
前几天做过跟这个思路完全一样的题,由于移动方向唯一,每个格子的路径就等于左边格子的路径数加上上边格子的路径数

代码(Go):

func uniquePaths(m int, n int) int {
    dp := make([][]int,0,m)
    for i := 0;i < m;i++{
        dpi := make([]int,0,n)
        for j := 0;j < n;j++{
            temp := 0
            if i > 0{
                temp += dp[i - 1][j]
            }
            if j > 0{
                temp += dpi[j - 1]
            }
            if i == 0 && j == 0{
                temp = 1
            }
            dpi = append(dpi,temp)
        }
        dp = append(dp,dpi)
    }
    return dp[m - 1][n - 1]
}

64. 最小路径和-中等

题目描述:
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。

题解:
跟上一题基本一样,框架我直接拿来用了,其实就相当于上一题加了个权值,比较加权后的路径长度

代码(Go):

func minPathSum(grid [][]int) int {
    dp := make([][]int,0,len(grid))
    for i := 0;i < len(grid);i++{
        dpi := make([]int,0,len(grid[0]))
        for j := 0;j < len(grid[0]);j++{
            temp := 0
            if i > 0 && j > 0{
                if dp[i - 1][j] < dpi[j - 1]{
                    temp = dp[i - 1][j]
                }else{
                    temp = dpi[j - 1]
                }
            }else if i > 0{
                temp += dp[i - 1][j]
            }else if j > 0{
                temp += dpi[j - 1]
            }
            dpi = append(dpi,temp + grid[i][j])
        }
        dp = append(dp,dpi)
    }
    return dp[len(grid) - 1][len(grid[0]) - 1]
}

总结

两道中等题第一天,做了两道动态规划,这两道还挺简单的,不过感觉同质化有点严重,以后两道中等题尽量不做一个类型的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值