洼地数组算法

前言

一种算法,计算洼地的容积简易版,洼地数组的容积计算

计算思路

实际上计算洼地的容积很难,立体空间,最常用的方式是极限思想,微积分,类似割圆术。把立体空间认为是很多微小的立方体。

那么进一步简化,计算2维空间的洼地容积

实际上还是可以使用极限的思想,看成很多微小的长方形,通过无限趋近的方式计算出来,不过这里的算法仅仅是一种更简单的算法,计算数组的洼地容积,即点的容积:如下图

var arr []int = []int{3, 5, 4, 6, 1, 4, 1,3}

计算洼地的数字的容积值的和

分析上图,计算数组的洼地容积,需要的洼地的核心数据已经画出横线了。根据规律,洼地最小值原则,木桶效应算法经验总结:

1. 从左到右取最大值

2. 从右到左取最大值

3. 获取上面2步取到的最小值

4. 用最小值减去原始值

5. 求和上一步的结果

编写算法

package main

import "fmt"

func main() {
	var arr []int = []int{3, 5, 4, 6, 1, 4, 1, 3}
	len := len(arr)

	var maxFromLeft int = 0
	var arrLeftMax = make([]int, len)
	var maxFromRight int = 0
	var arrRightMax = make([]int, len)
	//计算左边最大, 怀念Java流式计算,go有第3方实现
	for i := 0; i < len; i++ {
		if arr[i] > maxFromLeft {
			maxFromLeft = arr[i]
		}
		arrLeftMax[i] = maxFromLeft
	}

	var count int = 0
	for j := len - 1; j >= 0; j-- {
		if arr[j] > maxFromRight {
			maxFromRight = arr[j]
		}
		arrRightMax[j] = maxFromRight
		//比对最小值,洼地是最小值,木桶原理,我们需要的就是最小值
		//最小值对比原始值,顺便做容积计数求和
		if arrRightMax[j] >= arrLeftMax[j] {
			count += arrLeftMax[j] - arr[j]
		} else {
			count += arrRightMax[j] - arr[j]
		}
	}

	fmt.Println("计算结果如下:", count)
}

当前的示例结果为6

总结

算法的本质是总结经验,实际上算法是很多规律计算出来的,当然也可以使用蛮力,毕竟计算机计算能力这么强。不过如果算法形成的数据结构那么就是规律的代表,比如数组、链表、树、表、图等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值