题目看截图算法
算法以下数组
package main import ( "fmt" "sort" ) func jz(arr [][]int) int{ // 声明全部数字的和 sum:=0; // 获取矩阵行数 此例中的l=5 l := len(arr) for i:=0;i<l;{ // 这里利用sort.Ints对数组进行由小到大排序 sort.Ints(arr[i]) // 若是i==0 第一行的状况下 直接将排序后的数组第一个数字的值累加到sum if i==0 { sum+=arr[i][0] } // 这里就是尝试往下跳1步 和 2步比较那个的和最小 if i+1<l && i+2<l { sort.Ints(arr[i+1]) sort.Ints(arr[i+2]) temp:=arr[i+1][0]+arr[i+2][0]; //比较后二者的和 和 两个值的关系。若是和小于二者的任何一个那就选择跳1步 if arr[i+1][0]>temp && arr[i+2][0]>temp { sum+=arr[i+1][0] i++ }else{ //判断从当前指针位置,向后数1 和向后数2两个位置数字的大小,选择较小的 if arr[i+1][0]>arr[i+2][0] { //此时是向下1步比向下2步的要大,因此选择第二个 sum+=arr[i+2][0]; i+=2 }else{ sum+=arr[i+1][0]; i++ } } }else if i+1<l{ //临界值处理,此时的i+2已经越界 不能选择直接使用最后一个值就能够了 sort.Ints(arr[i+1]) sum+=arr[i+1][0] break } // 上面的if else if的判断条件的顺序也是解决这个题的关键 } return sum } func main() { //矩阵声明5x5 arr:=[][]int{ {3,0,-2,4,0}, {-1,2,-2,1,4}, {3,1,-2,-3,3}, {2,-4,-3,-3,2,}, {5,2,-2,-3,1}, } fmt.Println(arr) a:=jz(arr) fmt.Println("总数",a) }