题解 | #数组分组#

数组分组

https://www.nowcoder.com/practice/9af744a3517440508dbeb297020aca86

package main

import (
	"fmt"
	"sort"
)

func isValid(nums []int, pathIdxs []int) bool {
    var arr1 []int
    var arr2 []int

    idxMap := make(map[int]struct{}, 0)
    for _, idx := range pathIdxs {
        idxMap[idx] = struct{}{}
    }

    for i:=0; i<len(nums); i++ {
        if _, ok := idxMap[i]; !ok {
            arr1 = append(arr1, nums[i])
        } else {
            arr2 = append(arr2, nums[i])
        }
    }

    arr1HasThree, arr1HasFive := false, false
    arr2HasThree, arr2HasFive := false, false

    for _, num := range arr1 {
        if num == 0 {
            continue
        }
        if num % 3 == 0 {
            arr1HasThree = true
        }
        if num % 5 == 0 {
            arr1HasFive = true
        }
    }

    for _, num := range arr2 {
        if num == 0 {
            continue
        }
        if num % 3 == 0 {
            arr2HasThree = true
        }
        if num % 5 == 0 {
            arr2HasFive = true
        }
    }

    if arr1HasThree && arr1HasFive {
        return false
    }

    if arr2HasThree && arr2HasFive {
        return false
    }

    if arr1HasThree && arr2HasThree {
        return false
    }

    if arr1HasFive && arr2HasFive {
        return false
    }

    return true
}

func backtracking(nums []int, start int, sum int, path []int, target int) bool {
    if start > len(nums) {
        return false
    }

    if sum == target {
        // fmt.Printf("candidate: %+v\n", path)
        if isValid(nums, path) {
            return true
        }
        return false
    }

    // if sum > target {
    //     return false
    // }

    for i:=start; i<len(nums); i++ {
        path = append(path, i)
        sum += nums[i]
        if backtracking(nums, i+1, sum, path, target) {
            return true
        }
        sum -= nums[i]
        path = path[:len(path)-1]
    }

    return false
}

func main() {
    var n int
    fmt.Scan(&n)

    var nums []int
    for i:=0; i<n; i++ {
        var num int
        fmt.Scan(&num)
        nums = append(nums, num)
    }

    sort.Ints(nums)

    var path []int
    var target int
    for _, num := range nums {
        target += num
    }

    if target % 2 != 0 {
        fmt.Println(false)
    } else {
        fmt.Println(backtracking(nums, 0, 0, path, target/2))
    }
}
// 本题输入为一行整数,所以采用:fmt.Scan(&n)

全部评论

相关推荐

好消息是活的像个人了,周末可以约会吃饭打游戏了坏消息是钱没了,当初来小红书就是为了钱啊哭笑不得😭
犯困嫌疑人:好事儿啊,取消大小周能有更多自己的时间,周末还能约对象玩,这不美滋滋?
投递小红书等公司6个岗位 > 小红书取消大小周
点赞 评论 收藏
分享
凉风落木楚山秋:1.教育背景,这一栏用于说明你是哪个省份的,一般四非在省内认可度是高于外省的,但是到外边了基本路边一条。然后这一栏可以写一写校内荣誉补充满一行 2.个人介绍没必要,把下面的技能内容放到这里面来,个人情况挖空等面试官来问你 3.竞赛奖项单独一栏,专门用2-3行小字写你获得了哪些奖 4.后面的模块就分为实习经历和项目经历,一个写实习做的项目,一个写学校做的项目。另外在项目中承担的角色可以标出来,时间周期也可以写一下 5.其他,你的经历和我挺像,我也大二的时候做前端,看你想找小程序还是web方向的。做小程序我感觉你这简历已经够了,比我的水货学弟强多了。要做web的话尽量再写一个react项目,不然走不远。另外,那个排课的项目看起来好水,没有亮点,可以再挖掘一下 6.名称,技术名称书写风格不统一,要么统一大驼峰,要么就用全小写+空格,保持一致好看很多
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务