2023-08-28:用go语言编写。给你一个正整数数组nums, 同时给你一个长度为 m 的整数数组 queries。

第 i 个查询中,你需要将 nums 中所有元素变成 queries[i] 。你可以执行以下操作 任意 次:

将数组里一个元素 增大 或者 减小 1 。请你返回一个长度为 m 的数组 answer ,

其中 answer[i]是将 nums 中所有元素变成 queries[i] 的 最少 操作次数。

注意,每次查询后,数组变回最开始的值。

输入:nums = [3,1,6,8], queries = [1,5]。

输出:[14,10]。

来自左程云

答案2023-08-28:

大体过程如下:

1.定义 minOperations 函数,用于计算将 nums 中的元素转换为 queries 中每个元素所需的最少操作次数。函数接受两个参数:nums(正整数数组)和 queries(整数数组)。

2.获取 nums 数组的长度,对 nums 进行排序,并创建一个长度为 n+1sum 数组,用于保存从 nums 累加得到的前缀和。

3.创建一个空的 ans 数组,用于存储结果。

4.遍历 queries 中的每个元素 v

5.在 bs 函数中,使用二分查找找到 nums 中小于 v 的最右位置,并将结果赋给 less

6.计算当前查询对应的最少操作次数 curAns:

  • 初始化变量 curAns(less+1)*v - sum0(sum, 0, less),表示将小于 v 的元素增加到 v 的操作次数。

  • bs 函数中,使用二分查找找到 nums 中大于等于 v+1 的最左位置,并将结果赋给 more

  • curAns 更新为 curAns + sum0(sum, more+1, n-1) - (n-more-1)*v,表示将大于 v 的元素减小到 v 的操作次数。

7.将 curAns 添加到 ans 数组中。

8.返回得到的 ans 数组作为结果。

9.在 main 函数中,定义给定的 numsqueries

10.调用 minOperations 函数,并将结果赋给 result

11.打印结果 result

总体的时间复杂度是 O(m*log(n)),其中 m 是 queries 的长度,n 是 nums 的长度。这是因为对于每个查询,都需要使用二分查找来找到相应的位置。

总体的空间复杂度是 O(n),其中 n 是 nums 的长度。这是因为需要创建额外的数组 sum 来保存前缀和。

go完整代码如下:

package main

import (
"fmt"
"sort"
) func minOperations(nums []int, queries []int) []int {
n := len(nums)
sort.Ints(nums)
sum := make([]int, n+1)
for i := 0; i < n; i++ {
sum[i+1] = sum[i] + int(nums[i])
}
ans := make([]int, 0)
var less, more, curAns int
for _, v := range queries {
less = bs(nums, v)
curAns = (less+1)*int(v) - sum0(sum, 0, int(less))
more = bs(nums, v+1)
curAns += sum0(sum, more+1, n-1) - int(n-more-1)*int(v)
ans = append(ans, curAns)
}
return ans
} // 查找 <v 最右的位置
// 没有返回-1
func bs(nums []int, v int) int {
l := 0
r := len(nums) - 1
var m, ans int = -1, -1
for l <= r {
m = int((l + r) / 2)
if nums[m] < v {
ans = m
l = int(m + 1)
} else {
r = int(m - 1)
}
}
return ans
} func sum0(sum []int, l, r int) int {
if l > r {
return 0
}
return sum[r+1] - sum[l]
} func main() {
nums := []int{3, 1, 6, 8}
queries := []int{1, 5}
result := minOperations(nums, queries)
fmt.Println(result)
}

rust完整代码如下:

fn min_operations(nums: Vec<i32>, queries: Vec<i32>) -> Vec<i64> {
let mut nums = nums.clone();
nums.sort(); let n = nums.len() as i32;
let mut sum = vec![0; n as usize + 1];
for i in 0..n {
sum[i as usize + 1] = sum[i as usize] + nums[i as usize] as i64;
} let mut ans = Vec::new();
for v in queries {
let less = bs(&nums, v);
let mut cur_ans = (less + 1) as i64 * v as i64 - sum0(&sum, 0, less);
let more = bs(&nums, v + 1);
cur_ans += sum0(&sum, more + 1, n - 1) - (n - more - 1) as i64 * v as i64;
ans.push(cur_ans);
} ans
} fn bs(nums: &Vec<i32>, v: i32) -> i32 {
let mut l = 0;
let mut r = nums.len() as i32 - 1;
let mut ans = -1; while l <= r {
let m = (l + r) / 2;
if nums[m as usize] < v {
ans = m;
l = m + 1;
} else {
r = m - 1;
}
} ans
} fn sum0(sum: &Vec<i64>, l: i32, r: i32) -> i64 {
if l > r {
0
} else {
sum[r as usize + 1] - sum[l as usize]
}
} fn main() {
let nums = vec![3, 1, 6, 8];
let queries = vec![1, 5]; let result = min_operations(nums, queries);
println!("{:?}", result);
}

c++完整代码如下:

#include <iostream>
#include <vector>
#include <algorithm> using namespace std; int bs(vector<int>& nums, int v) {
int l = 0;
int r = nums.size() - 1;
int m, ans = -1;
while (l <= r) {
m = (l + r) / 2;
if (nums[m] < v) {
ans = m;
l = m + 1;
}
else {
r = m - 1;
}
}
return ans;
} long long sum0(vector<long long>& sum, int l, int r) {
return l > r ? 0 : (sum[r + 1] - sum[l]);
} vector<long long> minOperations(vector<int>& nums, vector<int>& queries) {
int n = nums.size();
sort(nums.begin(), nums.end()); vector<long long> sum(n + 1, 0);
for (int i = 0; i < n; i++) {
sum[i + 1] = sum[i] + nums[i];
} vector<long long> ans;
int less, more;
long long curAns;
for (int v : queries) {
less = bs(nums, v);
curAns = (long long)(less + 1) * v - sum0(sum, 0, less);
more = bs(nums, v + 1);
curAns += sum0(sum, more + 1, n - 1) - (long long)(n - more - 1) * v;
ans.push_back(curAns);
}
return ans;
} int main() {
vector<int> nums = { 3, 1, 6, 8 };
vector<int> queries = { 1, 5 }; vector<long long> result = minOperations(nums, queries); for (long long ans : result) {
cout << ans << " ";
}
cout << endl; return 0;
}

c完整代码如下:

#include <stdio.h>
#include <stdlib.h> int binarySearch(int* nums, int numsSize, int v) {
int l = 0;
int r = numsSize - 1;
int m, ans = -1;
while (l <= r) {
m = (l + r) / 2;
if (nums[m] < v) {
ans = m;
l = m + 1;
}
else {
r = m - 1;
}
}
return ans;
} long long sum(long long* sumArray, int l, int r) {
return l > r ? 0 : (sumArray[r + 1] - sumArray[l]);
} int cmpfunc(const void* a, const void* b) {
return (*(int*)a - *(int*)b);
} long long* minOperations(int* nums, int numsSize, int* queries, int queriesSize, int* returnSize) {
int n = numsSize;
qsort(nums, n, sizeof(int), cmpfunc);
long long* sumArray = (long long*)malloc((n + 1) * sizeof(long long));
sumArray[0] = 0;
for (int i = 0; i < n; i++) {
sumArray[i + 1] = sumArray[i] + nums[i];
} long long* ans = (long long*)malloc(queriesSize * sizeof(long long)); int less, more;
long long curAns;
for (int i = 0; i < queriesSize; i++) {
int v = queries[i];
less = binarySearch(nums, n, v);
curAns = (long long)(less + 1) * v - sum(sumArray, 0, less);
more = binarySearch(nums, n, v + 1);
curAns += sum(sumArray, more + 1, n - 1) - (long long)(n - more - 1) * v;
ans[i] = curAns;
} *returnSize = queriesSize;
return ans;
} int main() {
int nums[] = { 3, 1, 6, 8 };
int queries[] = { 1, 5 };
int numsSize = sizeof(nums) / sizeof(nums[0]);
int queriesSize = sizeof(queries) / sizeof(queries[0]);
int returnSize; long long* result = minOperations(nums, numsSize, queries, queriesSize, &returnSize); printf("Result: ");
for (int i = 0; i < returnSize; i++) {
printf("%lld ", result[i]);
}
printf("\n"); free(result);
return 0;
}

2023-08-28:用go语言编写。给你一个正整数数组nums, 同时给你一个长度为 m 的整数数组 queries。 第 i 个查询中,你需要将 nums 中所有元素变成 queries[i] 。的更多相关文章

  1. 给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。-----力扣

    给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积. 示例: 输入: [1 ...

  2. java—数组乘积输入: 一个长度为n的整数数组input 输出: 一个长度为n的数组result,满足result[i] = input数组中,除了input[i] 之外的所有数的乘积,不用考虑溢出例如 input {2, 3, 4, 5} output: {60, 40, 30, 24}

    /** * 小米关于小米笔试题 数组乘积输入: 一个长度为n的整数数组input 输出: 一个长度为n的数组result,满足result[i] = * input数组中,除了input[i] 之外的 ...

  3. 【算法30】从数组中选择k组长度为m的子数组,要求其和最小

    原题链接:codeforce 267 Div2 C 问题描述: 给定长度为n的数组a[],从中选择k个长度为m的子数组,要求和最大. 形式描述为:选择$k$个子数组[$l_1$, $r_1$], [$ ...

  4. Day_09【常用API】扩展案例1_程序中使用一个长度为3的对象数组,存储用户的登录名和密码……

    需求说明:实现用户注册.登陆功能: 1.程序中使用一个长度为3的**对象数组**,存储用户的登录名和密码: 例如如下格式: 登录名 密码 生日 爱好 zhangsan 1111 1998-03-15 ...

  5. C语言的本质(28)——C语言与汇编之用汇编写一个Helloword

    为了更加深入理解C语言的本质,我们需要学习一些汇编相关的知识.作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但是非常重要.因为它能够完成许多其它语言所无法完成的功能.就拿 Linux 内核 ...

  6. 用Java语言编写一个简易画板

    讲了三篇概博客的概念,今天,我们来一点实际的东西.我们来探讨一下如何用Java语言,编写一块简易的画图板. 一.需求分析 无论我们使用什么语言,去编写一个什么样的项目,我们的第一步,总是去分析这个项目 ...

  7. 从一个集合中查找最大最小的N个元素——Python heapq 堆数据结构

    Top N问题在搜索引擎.推荐系统领域应用很广, 如果用我们较为常见的语言,如C.C++.Java等,代码量至少也得五行,但是用Python的话,只用一个函数就能搞定,只需引入heapq(堆队列)这个 ...

  8. Python语言编写BP神经网络

    Python语言编写BP神经网络 2016年10月31日 16:42:44 ldy944758217 阅读数 3135   人工神经网络是一种经典的机器学习模型,随着深度学习的发展神经网络模型日益完善 ...

  9. 近50种语言编写的“Hello, World”,你会几种?可不要贪杯哦~

    本文转自公众号CSDN(ID:CSDNnews)作者:Sylvain Saurel,译者:风车云马

  10. 基于php基础语言编写的小程序之计算器

    基于php基础语言编写的小程序之计算器 需求:在输入框中输入数字进行加.减.乘.除运算(html+php) 思路: 1首先要创建输入数字和运算符的输入框,数字用input的text属性,运算符用sel ...

随机推荐

  1. 一次考试的简单T3

    我的第一个想法其实是毫无头绪 根本就想不到dp,直接就写了爆搜后来讲了才知道... 这种dp的状态好像是一类dp的模型,他们的状态都有这样的一维:以第i个数结尾.这样的dp有什么样的标志呢?以第i个数 ...

  2. 铅华洗尽,粉黛不施,人工智能AI基于ProPainter技术去除图片以及视频水印(Python3.10)

    视频以及图片修复技术是一项具有挑战性的AI视觉任务,它涉及在视频或者图片序列中填补缺失或损坏的区域,同时保持空间和时间的连贯性.该技术在视频补全.对象移除.视频恢复等领域有广泛应用.近年来,两种突出的 ...

  3. mysql修改密码和开启远程访问

    mysql默认是关闭远程访问的,开启命令如下 1.首先打开mysql所在的bin目录,C:\Program Files\MySQL\MySQL Server 5.5\bin 在地址栏输入cmd,回车 ...

  4. Util应用框架快速入门(5) - 权限入门

    本文将引导你运行Util权限管理模块,并对UI按钮和API操作进行访问控制. Util平台介绍 Util应用框架是一组类库,它们提供了有用的功能. 虽然Util配套代码生成器能够帮助你创建项目基架,但 ...

  5. Util应用框架核心(一) - 服务配置

    本文介绍在项目中如何配置 Util 依赖服务. 文章分为多个小节,如果对设计原理不感兴趣,只需要阅读基础用法部分即可. 基础用法 Asp.Net Core 项目服务配置 调用 WebApplicati ...

  6. 25. 干货系列从零用Rust编写正反向代理,序列化之serde是如何工作的

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现 ...

  7. SNN_LIF模型

    LIF模型 Leaky integrity-Fire(LIF)模型 输入信号直接影响神经元的状态,即神经元膜电位,只有当膜电位上升到阈值的时候,才会产生输出信号. 膜电位:细胞膜两侧的电位差.只有当膜 ...

  8. python 执行脚本,并将输出打印到文件

    转载请注明出处: 在使用 python 直接执行脚本时,执行的相关输出会打印到当前的控制台,如果想输出到指定的文件,可以采用以下几种方式: 1.在启动时,使用 > 操作符,该操作符会将输出写入到 ...

  9. 题解 CF1401C

    题目大意: 给定一序列 \(A\),定义当且仅当 \(\gcd(a_i,a_j)=a_{min}\) 时,元素 \(a_i\) 和 \(a_j\) 可以交换. 问当前给定的序列 \(A\) 能否转化为 ...

  10. WebGL初接触

    有感于在不少jd中看到关于WebGL的内容,想起来之前在高程中还没看完的canvas,就匆匆把剩余的一点看完了,高程中的内容还是皮毛,就属于很基础的.概念性的东西. WebGL 画布的3D上下文.不是 ...