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 := []int{1, 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.的更多相关文章

  1. C++获取数组的长度

    C++获取数组的长度 #include<iostream> using namespace std; template<class T> int length(T& a ...

  2. 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度为O(N),且要求不能用非基于比较的排序

    题目: 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度为O(N),且要求不能用非基于比较的排序 public static int maxGap(int nums[]) { if ( ...

  3. 给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积。例如arr=[-2.5,4,0,3,0.5,8,-1],子数组[3,0.5,8]累乘可以获得最大的乘积12,所以返回12。

    分析,是一个dp的题目, 设f[i]表示以i为结尾的最大值,g[i]表示以i结尾的最小值,那么 f[i+1] = max{f[i]*arr[i+1], g[i]*arr[i+1],arr[i+1]} ...

  4. 刷题3:给定一个数组 nums,判断 nums 中是否存在三个下标 a,b,c数相加等于targe且a,b,c不相等

    题目: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,下标 ,a ,b , c 对应数相加等于 targe 找出所有满足条件且不重复的三元组下标 解析: ...

  5. 9.11排序与查找(三)——给定一个排序后的数组,包括n个整数,但这个数组已被旋转过多次,找出数组中的某个元素

    /**  * 功能:给定一个排序后的数组.包括n个整数.但这个数组已被旋转过多次,次数不详.找出数组中的某个元素.  * 能够假定数组元素原先是按从小到大的顺序排列的.  */ /** * 思路:数组 ...

  6. 给定一个无序数组arr,求出需要排序的最短子数组长度。例如: arr = [1,5,3,4,2,6,7] 返回4,因为只有[5,3,4,2]需要排序。

    思路 首先从左往右遍历,然后设定一个Max,如果遍历的过程中array[i]大于Max,则置换Max,若小于Max,则指定 k 记录该位置. 然后再从右往左遍历,设定一个Min,在遍历的过程中arra ...

  7. 给定一个整数N,找出一个比N大且最接近N,但二进制权值与该整数相同 的数

    1,问题描述 给定一个整数N,该整数的二进制权值定义如下:将该整数N转化成二进制表示法,其中 1 的个数即为它的二进制权值. 比如:十进制数1717 的二进制表示为:0000 0110 1011 01 ...

  8. 课堂练习:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。

    题目 1 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 2 要求: (1) 写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数.例如 f(12)  ...

  9. LeetCode竞赛题:K 次取反后最大化的数组和(给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。)

    给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次.(我们可以多次选择同一个索引 i.) 以这种方式修改数组后 ...

  10. [java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.

    给定一个数组,求和为定值的所有组合, 这道算法题在leetcode应该算是中等偏下难度, 对三到五年工作经验主要做业务开发的同学来说, 一般较难的也就是这种程度了. 简述经过: 不算hr面,总计四面, ...

随机推荐

  1. supervisor不一样的日志轮转

    出于项目需求,需要读取某个进程的最新日志,而这个进程刚好是supervisor管控. 很自然地我就想到了,根据日志的编辑时间排序,获取最新的日志文件. 然而,发现了奇怪的一幕: 发现什么没有? web ...

  2. 不使用setTimeout的延迟执行

    function sleep(ms){ var time = new Date(); time.setTime(time.getTime() + ms); while(new Date().getTi ...

  3. linux 打包各种后缀的命令

    01-.tar格式解包:[*******]$ tar xvf FileName.tar打包:[*******]$ tar cvf FileName.tar DirName(注:tar是打包,不是压缩! ...

  4. 获取请求结果中json数据的值

    import json   with open("config.json", "r") as f:        your_dict = json.loads( ...

  5. 初认Spring

    官网地址:https://spring.io/ Spring Framework的系统架构 1.Core Contiainer:核心容器 2.AOP:面向切片编程 3.Aspects:AOP思想实现 ...

  6. MyBatisPlus映射匹配兼容性

    字段映射与表名映射 1.当数据库表名tbl_user与实体类名User不一致时:在实体类上添加 :@TableName("tbl_user") package com.itheim ...

  7. 从零开始学Java系列之如何使用记事本编写java程序

    前言 在上一篇文章中,壹哥给大家介绍了Java中的标识符及其命名规则.规范,Java里的关键字和保留字,以及Java中的编码规范. 我们在之前编写案例时,使用的开发工具都是windows自带的txt记 ...

  8. conda环境下使用nvcc -V报错nvcc: command not found的一种解决方法

    前言 缘起  实验室的学弟问我为什么他使用nvcc命令报错,起先我以为他用的是老师给的root账户,按照参考文献1便可以解决问题.  但由于并非root用户,/usr/local下没有cuda,于是便 ...

  9. Win11右键菜单改回传统样式

    Win11右键菜单,比较不人性化,隐藏了一些常用选项,需要点"更多选项"才能显示,多次一举. 解决方法,一句话: reg.exe add "HKCU\Software\C ...

  10. 移动端网页--better-scroll介绍

    移动端网页--better-scroll介绍 Options 起始位置及滚动方向 startX:0 开始时的X轴位置 startY:0 开始时的Y轴位置 scrollY: true 滚动方向为 Y 轴 ...