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
执行结果如下:
以上是关于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,代表绳子的长度。返回绳子最多压中几个点?即使绳子边缘处盖住点也算盖住。