Golang语言[6] 递增的三元子序列/笨阶乘/矩阵查找/直方图的水量 |Go主题月(下)

简介: https://developer.aliyun.com/article/901821

python



class Solution(object):
    def clumsy(self, N):
        """
        :type N: int
        :rtype: int
        """
        if N == 1:
            return 1
        elif N == 2:
            return 2
        elif N == 3:
            return 6
        elif N == 4:
            return 7
        if N % 4 == 0:
            return N + 1
        elif N % 4 <= 2:
            return N + 2
        else:
             return N - 1


typescript



function clumsy(N: number): number {
    if (N === 1) {
        return 1
    } else if (N === 2) {
        return 2
    } else if (N === 3) {
        return 6
    } else if (N === 4) {
        return 7
    }
    if (N % 4 === 0) {
        return N + 1
    } else if (N % 4 <= 2) {
        return N + 2
    } else {
        return N - 1
    }
};


17.21. 直方图的水量



难度:[困难]


给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1。


1.JPG


上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的直方图,在这种情况下,可以接 6 个单位的水(蓝色部分表示水)。 感谢 Marcos 贡献此图。


示例:


输入: [0,1,0,2,1,0,1,3,2,1,2,1]

输出: 6


【思路】动态规划


1.记录height中的每个元素,从左向右扫描并记录右边的最大高度;

2.记录height中的每个元素,从右向左扫描并记录右边的最大高度;

3.将左右位置元素对比取最小的元素,减去数组当前元素的高度。


从左向右扫描并记录右边的最大高度

1.JPG

从右向左扫描并记录右边的最大高度

2.JPG

取高度最小值

3.JPG

go



func trap(height []int) int {
    n := len(height)
    if n == 0 {
        return 0
    }
    //记录左边每个元素最大高度
    leftMax := make([]int, n)
    leftMax[0] = height[0]
    for i := 1; i < n; i++ {
        leftMax[i] = max(leftMax[i-1], height[i])
    }
    //记录左边每个元素最大高度
    rightMax := make([]int, n)
    rightMax[n-1] = height[n-1]
    for i := n - 2; i >= 0; i-- {
        rightMax[i] = max(rightMax[i+1], height[i])
    }
    fmt.Println(leftMax, rightMax)
    ret := 0
    for j := 0; j < n; j++ {
        ret += (min(leftMax[j], rightMax[j]) - height[j])
    }
    return ret
}
//由于Go语言里面没有max(),min()需要自己实现一个
func max(a, b int) int {
    if a-b > 0 {
        return a
    }
    return b
}
func min(a, b int) int {
    if a-b > 0 {
        return b
    }
    return a
}

Javascript



var trap = function (height) {
    let len = height.length
    if (len === 0) return 0
    //记录左边每个矩形最大高度
    let left = Array(len).fill(0)
    left[0] = height[0]
    for (let i = 1; i < len; ++i) {
        left[i] = Math.max(left[i - 1], height[i])
    }
    //记录右边每个矩形最大高度
    let right = Array(len).fill(0)
    right[len - 1] = height[len - 1]
    for (let i = len - 2; i >= 0; --i) {
        right[i] = Math.max(right[i + 1], height[i])
    }
    //记录结果
    let ret = 0
    for (let i = 0; i < len; ++i) {
        //左右对比取最小边界,减去当前矩形高度
        ret += Math.min(left[i], right[i]) - height[i]
    }
    return ret
};


Typescript



function trap(height) {
    var len = height.length;
    if (len === 0)
        return 0;
    //记录左边每个矩形最大高度
    var left = Array(len);
    left[0] = height[0];
    for (var i = 1; i < len; ++i) {
        left[i] = Math.max(left[i - 1], height[i]);
    }
    //记录右边每个矩形最大高度
    var right = Array(len);
    right[len - 1] = height[len - 1];
    for (var i = len - 2; i >= 0; --i) {
        right[i] = Math.max(right[i + 1], height[i]);
    }
    //记录结果
    var ret = 0;
    for (var i = 0; i < len; ++i) {
        //左右对比取最小边界,减去当前矩形高度
        ret += Math.min(left[i], right[i]) - height[i];
    }
    return ret;
}


python



class Solution(object):
    def trap(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        if not height:
            return 0
        # 数组长度
        n = len(height)
        # 记录左边每个矩形最大高度
        left = [0]*n
        left[0] = height[0]
        for i in range(1,n):
            left[i] = max(left[i - 1], height[i])
        # 记录右边每个矩形最大高度
        right = [0]*n
        right[n - 1] = height[n - 1]
        for i in range(n-2,-1,-1):
            right[i] = max(right[i + 1], height[i])
        # 记录结果
        ret = sum(min(left[i], right[i]) - height[i] for i in range(n)) 
        return ret
相关文章
|
15天前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
26 7
|
15天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
15天前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
92 71
|
14天前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
100 67
|
17天前
|
Go 索引
go语言for遍历数组或切片
go语言for遍历数组或切片
88 62
|
19天前
|
并行计算 安全 Go
Go语言中的并发编程:掌握goroutines和channels####
本文深入探讨了Go语言中并发编程的核心概念——goroutine和channel。不同于传统的线程模型,Go通过轻量级的goroutine和通信机制channel,实现了高效的并发处理。我们将从基础概念开始,逐步深入到实际应用案例,揭示如何在Go语言中优雅地实现并发控制和数据同步。 ####
|
15天前
|
存储 Go
go语言中映射
go语言中映射
32 11
|
17天前
|
Go
go语言for遍历映射(map)
go语言for遍历映射(map)
29 12
|
16天前
|
Go 索引
go语言使用索引遍历
go语言使用索引遍历
26 9
|
20天前
|
安全 Serverless Go
Go语言中的并发编程:深入理解与实践####
本文旨在为读者提供一个关于Go语言并发编程的全面指南。我们将从并发的基本概念讲起,逐步深入到Go语言特有的goroutine和channel机制,探讨它们如何简化多线程编程的复杂性。通过实例演示和代码分析,本文将揭示Go语言在处理并发任务时的优势,以及如何在实际项目中高效利用这些特性来提升性能和响应速度。无论你是Go语言的初学者还是有一定经验的开发者,本文都将为你提供有价值的见解和实用的技巧。 ####