2022-01-11:给定一个正数数组arr长度为n正数x正数y。 你的目标是让arr整体的累加和<=0, 你可以对数组中的数num执行以下三种操作中的一种,且每个数最多能执行一次操作 : 1.

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-01-11:给定一个正数数组arr长度为n正数x正数y。 你的目标是让arr整体的累加和<=0, 你可以对数组中的数num执行以下三种操作中的一种,且每个数最多能执行一次操作 : 1.相关的知识,希望对你有一定的参考价值。

2022-01-11:给定一个正数数组arr长度为n、正数x、正数y。
你的目标是让arr整体的累加和<=0,
你可以对数组中的数num执行以下三种操作中的一种,且每个数最多能执行一次操作 :
1.不变;
2.可以选择让num变成0,承担x的代价;
3.可以选择让num变成-num,承担y的代价。
返回你达到目标的最小代价。
数据规模 : 面试时面试官没有说数据规模。
来自微软面试。

答案2022-01-11:

贪心。从大到小排序。
x>=y时,就只执行y操作,没有x操作。
x<y时,先执行y操作,再执行x操作,最后无操作。这三种操作不可能交替。
时间复杂度:排序的。
空间复杂度:排序的。

代码用golang编写。代码如下:

package main

import (
    "fmt"
    "sort"
)

func main() 
    arr := []int1, 2, 3, 4, 5
    ret := minOpStep3(arr, 4, 3)
    fmt.Println(ret)


func minOpStep3(arr []int, x, y int) int 
    // 系统排序,小 -> 大
    sort.Ints(arr)
    n := len(arr)
    // 如何变成 大 -> 小
    for l, r := 0, n-1; l <= r; l, r = l+1, r-1 
        tmp := arr[l]
        arr[l] = arr[r]
        arr[r] = tmp
    
    if x >= y 
        sum := 0
        for _, num := range arr 
            sum += num
        
        cost := 0
        for i := 0; i < n && sum > 0; i++ 
            sum -= arr[i] << 1
            cost += y
        
        return cost
     else 
        // 0个数执行Y
        benefit := 0
        // 全部的数都需要执行x,才能让累加和<=0
        cost := len(arr) * x
        holdSum := 0
        for yRight, holdLeft := 0, n; yRight < holdLeft-1; yRight++ 
            benefit += arr[yRight]
            for holdLeft-1 > yRight && holdSum+arr[holdLeft-1] <= benefit 
                holdSum += arr[holdLeft-1]
                holdLeft--
            
            // 0...yRight x holdLeft....
            cost = getMin(cost, (yRight+1)*y+(holdLeft-yRight-1)*x)
        
        return cost
    


func getMin(a, b int) int 
    if a < b 
        return a
     else 
        return b
    

执行结果如下:


左神java代码

以上是关于2022-01-11:给定一个正数数组arr长度为n正数x正数y。 你的目标是让arr整体的累加和<=0, 你可以对数组中的数num执行以下三种操作中的一种,且每个数最多能执行一次操作 : 1.的主要内容,如果未能解决你的问题,请参考以下文章

2022-01-12:给定一个正数数组arr,长度为n,下标0~n-1, arr中的0n-1位置不需要达标,它们分别是最左最右的位置, 中间位置i需要达标,达标的条件是 : arr[i-1] >

2022-05-20:给定一个正数数组arr,长度为N,依次代表N个任务的难度,给定一个正数k, 你只能从0任务开始,依次处理到N-1号任务结束,就是一定要从左往右处理任务, 只不过,难度差距绝对值不

[算法]最长子数组问题

2022-05-21:给定一个数组arr,长度为n, 表示n个服务员,每个人服务一个人的时间。 给定一个正数m,表示有m个人等位。 如果你是刚来的人,请问你需要等多久? 假设:m远远大于n,比如n<=

2021-05-01:给定一个有序数组arr,代表坐落在X轴上的点。给定一个正数K,代表绳子的长度。返回绳子最多压中几个点?即使绳子边缘处盖住点也算盖住。

算法总结之 未排序正数数组中累加和为给定值的最长子数组长度