1

题目看截图

图片描述

算法如下

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)
}

SmallForest
239 声望12 粉丝

github: