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

力扣每日四题

  • 2496. 数组中字符串的最大值-简单
  • 941. 有效的山脉数组-简单
  • 256. 粉刷房子-中等
  • 714. 买卖股票的最佳时机含手续费-中等
  • 总结

2496. 数组中字符串的最大值-简单

题目描述:
一个由字母和数字组成的字符串的 值 定义如下:
如果字符串 只 包含数字,那么值为该字符串在 10 进制下的所表示的数字。
否则,值为字符串的 长度 。
给你一个字符串数组 strs ,每个字符串都只由字母和数字组成,请你返回 strs 中字符串的 最大值 。

题解:
直接按描述模拟

代码(Go):

func maximumValue(strs []string) int {
    temp := 0
    for _,v := range strs{
        flag := 1
        for _,b := range v{
            if b < 48 || b > 57{
                flag = 0
            }
        }
        tempv := 0
        if flag == 0{
            tempv = len(v)
        }else{
            tempv,_ = strconv.Atoi(v)
        }
        if tempv > temp{
            temp = tempv
        }
    }
    return temp
}

941. 有效的山脉数组-简单

题目描述:
给定一个整数数组 arr,如果它是有效的山脉数组就返回 true,否则返回 false。
让我们回顾一下,如果 arr 满足下述条件,那么它是一个山脉数组:
arr.length >= 3
在 0 < i < arr.length - 1 条件下,存在 i 使得:
arr[0] < arr[1] < … arr[i-1] < arr[i]
arr[i] > arr[i+1] > … > arr[arr.length - 1]

题解:
对每种情况分类讨论

代码(Go):

func validMountainArray(arr []int) bool {
    if len(arr) == 1{
        return false
    }
    flag := 0
    for i := 1;i < len(arr);i++{
        if flag == 0{
            if arr[i] < arr[i - 1] && i != 1{
                flag = 1
            }else if arr[i] < arr[i - 1] && i == 1{
                return false
            }else if i == len(arr) - 1 || arr[i] == arr[i - 1]{
                return false
            }
        }
        if flag == 1{
            if arr[i] >= arr[i - 1]{
                return false
            }
        }
    }
    return true
}

256. 粉刷房子-中等

题目描述:
假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。
当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n x 3 的正整数矩阵 costs 来表示的。
例如,costs[0][0] 表示第 0 号房子粉刷成红色的成本花费;costs[1][2] 表示第 1 号房子粉刷成绿色的花费,以此类推。
请计算出粉刷完所有房子最少的花费成本。

题解:
由于能否粉刷相应颜色只取决于前一个房子,所以很容易看出递推关系,第i个房子涂某种颜色的成本就等于前一个房子涂另外两种颜色成本中较小的那个与自身涂色的成本之和

代码(Go):

func minCost(costs [][]int) int {
    for i := 1;i < len(costs);i++{
        costs[i][0] += min(costs[i - 1][1],costs[i - 1][2])
        costs[i][1] += min(costs[i - 1][0],costs[i - 1][2])
        costs[i][2] += min(costs[i - 1][1],costs[i - 1][0])
    }
    return min(costs[len(costs) - 1][0],min(costs[len(costs) - 1][1],costs[len(costs) - 1][2]))
}

func min(x int,y int) int {
    if x < y{
        return x
    }else{
        return y
    }
}

714. 买卖股票的最佳时机含手续费-中等

题目描述:
给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。
你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。
返回获得利润的最大值。
注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。

题解:
贪心。这个题有个大坑就是不能向没有手续费一样常规的遍历数组比较,挣钱就卖。因为手续费的存在当股票连续上升时频繁买卖会消耗手续费,所以不如直接保留股票到最高点再卖。因此我们需要在卖出时保留这个卖出的值,如果接下来的股票价格与手续费的和比这个卖出的值更大我们就不能入股票,因为此时买入股票想要赚钱后续卖价就一定高于我们保留的卖出值,既然如此还不如一直保留到更高点再卖,所以每次遇到更高的点我们都保存这个值,直到确定下次购买股票加手续费的价格比当前卖点更低时才确定从这个点卖出

代码(Go):

func maxProfit(prices []int, fee int) int {
    n := len(prices)
    buy := prices[0] + fee;
    re := 0;
    for i := 1;i < n;i++{
        if prices[i] + fee < buy {
            buy = prices[i] + fee
        }else if prices[i] > buy {
            re += prices[i] - buy
            buy = prices[i]
        }
    }
    return re
}

总结

昨天端午节出去吃饭了,这是补昨天的。感觉动态规划这个概念有点难区分,有的题解法感觉很像回溯或者分治,一遇到这种题我就完全不会了

你可能感兴趣的:(leetcode刷题,leetcode,算法,golang)