2022-04-22:给你两个正整数数组 nums 和 target ,两个数组长度相等。 在一次操作中,你可以选择两个 不同 的下标 i 和 j , 其中 0 <= i, j < nums.leng
2022-04-22:给你两个正整数数组 nums 和 target ,两个数组长度相等。
在一次操作中,你可以选择两个 不同 的下标 i 和 j ,
其中 0 <= i, j < nums.length ,并且:
令 nums[i] = nums[i] + 2 且
令 nums[j] = nums[j] - 2 。
如果两个数组中每个元素出现的频率相等,我们称两个数组是 相似 的。
请你返回将 nums 变得与 target 相似的最少操作次数。
测试数据保证 nums 一定能变得与 target 相似。
输入:nums = [8,12,6], target = [2,14,10]。
输出:2。
答案2022-04-22:
给定两个长度相等的整型数组 nums 和 target,要求将 nums 变为与 target 相似,并返回最少需要的操作次数。
具体地,每一次操作可以选择两个下标 i 和 j,并满足以下条件:
0 <= i,j < nums.lengthnums[i] = nums[i] + 2,nums[j] = nums[j] - 2
操作后,需要检查变换后的 nums 是否与 target 频率相等。如果是,则称 nums 与 target 是相似的,返回此时的操作次数。
按照题目描述实现过程可以分为以下几个步骤:
- 统计
nums和target中所有元素出现的频率,然后比较两者是否相同。由于题目保证了nums可以变为target相似,因此这一步可以省略。 - 对
nums和target进行奇偶数值分离,将奇数值从偶数值中分离出来。这一步可以使用split()函数实现。 - 对
nums和target分别对奇数值和偶数值进行排序。这里可以使用sort.Ints()函数进行排序。 - 逐一比较
nums和target中的对应元素,计算它们之间的差值的绝对值之和。这一步可以使用abs()函数和循环实现。 - 将差值的绝对值之和除以 4,即得到最少操作次数。
整个过程就是这样。具体来说,第二步和第三步是为了方便后面的比较和计算而进行的预处理。第四步是最重要的一步,需要仔细计算每一个位置上的差值,并将它们相加。第五步只是简单的除法运算,将计算结果转化为操作次数即可。
时间复杂度:
- 对于奇偶数值分离的操作,需要遍历一遍数组,时间复杂度为 $O(n)$;
- 对于排序操作和差值计算操作,需要遍历两次长度为 $n$ 的数组,时间复杂度为 $O(n \log n)$;
- 因此,总的时间复杂度为 $O(n \log n)$。
空间复杂度:
- 变量
numsOddSize、line和ans占用常数级别的空间,不随输入规模变化,因此空间复杂度为 O(1); - 函数中使用了
sort.Ints()函数进行排序,该函数使用了快速排序算法,在最坏情况下需要递归调用 log_2(n) 层,空间复杂度为 O(log n); - 因此,总的空间复杂度为 O\log n)。
综上所述,该算法的时间复杂度为 O(n log n),空间复杂度为 O(log n)。
go完整代码如下:
package main
import (
"fmt"
"sort"
)
func makeSimilar(nums, target []int) int64 {
n := len(nums)
numsOddSize := split(nums)
split(target)
sort.Ints(nums[:numsOddSize])
sort.Ints(nums[numsOddSize:])
sort.Ints(target[:numsOddSize])
sort.Ints(target[numsOddSize:])
var ans int64
for i := 0; i < n; i++ {
ans += int64(abs(nums[i] - target[i]))
}
return ans >> 2
}
func split(arr []int) int {
line := 0
for i := 0; i < len(arr); i++ {
if arr[i]&1 != 0 {
swap(arr, i, line)
line++
}
}
return line
}
func swap(arr []int, i, j int) {
tmp := arr[i]
arr[i] = arr[j]
arr[j] = tmp
}
func abs(x int) int {
if x < 0 {
return -x
}
return x
}
func main() {
nums := []int{8, 12, 6}
target := []int{2, 14, 10}
ans := makeSimilar(nums, target)
fmt.Println(ans)
}

rust完整代码如下:
fn make_similar(nums: Vec<i32>, target: Vec<i32>) -> i64 {
let n = nums.len();
let mut nums = nums;
let mut target = target;
let odd_size = split(&mut nums);
split(&mut target);
nums[..odd_size].sort_unstable();
nums[odd_size..n].sort_unstable();
target[..odd_size].sort_unstable();
target[odd_size..n].sort_unstable();
let mut ans = 0;
for i in 0..n {
ans += (nums[i] - target[i]).abs() as i64;
}
ans >> 2
}
fn split(arr: &mut [i32]) -> usize {
let mut line = 0;
for i in 0..arr.len() {
if arr[i] & 1 != 0 {
arr.swap(i, line);
line += 1;
}
}
line
}
fn main() {
let nums = vec![8, 12, 6];
let target = vec![2, 14, 10];
let ans = make_similar(nums, target);
println!("{}", ans);
}

2022-04-22:给你两个正整数数组 nums 和 target ,两个数组长度相等。 在一次操作中,你可以选择两个 不同 的下标 i 和 j , 其中 0 <= i, j < nums.leng的更多相关文章
- 输入两个正整数m和n,求其最大公约数和最小公倍数
public static void main(String[] args){ Scanner sc = new Scanner (System.in); int a,b; System.out ...
- 一个数组nums,其中任意两个值等于给定值target,返回这两个值在nums里的位置
package com.java.tencent; import java.lang.reflect.Array; import java.util.Arrays; import java.util. ...
- Ubuntu20.04/22.04 安装 Arduino IDE 2.x
这周收到两片基于LGT8F328P LQFP32的Arduino Mini EVB, 机器上没有 Arduino 环境需要新安装, 正好感受一下新出的 Arduino IDE 2.x, 记录一下 Ub ...
- C语言实验报告(五) 两个正整数的最大公约数
编程实现求两个正整数的最大公约数,要求计算最大公约数用函数fun(int a,int b)实现. #include<stdio.h>void main(){ int n,a,b; in ...
- SDUT 3503 有两个正整数,求N!的K进制的位数
有两个正整数,求N!的K进制的位数 题目链接:action=showproblem&problemid=3503">http://sdutacm.org/sdutoj/prob ...
- 代码代码:输入两个正整数m和n,求其最大公约数和最小公倍数。15 20 5
import java.util.Scanner; //输入两个正整数m和n,求其最大公约数和最小公倍数.15 20 5 public class Test { public static void ...
- 今天遇到的面试题for(j=0,i=0;j<6,i<10;j++,i++) { k=i+j; } k 值最后是多少?
for(j=0,i=0;j<6,i<10;j++,i++) { k=i+j; } k 值最后是多少? <script type="text/javascript" ...
- http://www.blogjava.net/crespochen/archive/2011/04/22/348819.html
http://blog.csdn.net/supersky07/article/details/7407523 http://blog.csdn.net/cuker919/article/detail ...
- 输入两个正整数num1、num2,计算并输出它们的和、差、积、整数商和余数
课本例题 /*输入两个正整数num1.num2,计算并输出它们的和.差.积.整数商和余数.*/ #include<stdio.h> int main() { int num1, num2; ...
- VB6查看桌面分辨率和工作区大小 2022.08.22 name.vt
VB6查看桌面分辨率和工作区大小 2022.08.22 name.vt Form1 内代码如下: ' 2022年8月22日 15时15分 ' 作者:name.vt Private Sub cmdCle ...
随机推荐
- decay_rate, decay_steps ,batchsize,iteration,epoch
(96条消息) decay_rate, decay_steps ,batchsize,iteration,epoch_hellocsz的博客-CSDN博客_decay_steps (1)batchsi ...
- 函数XLOOKUP
这个公式非OFFICE 365用户需要选中执行范围后 按Ctrl+Shift+Enter三键 (因为不支持公式溢出) XLOOKUP函数的基本结构是: =XLOOKUP(lookup_value,lo ...
- 在jsp页面int和String类型的相互转换
浅浅地来做一个对比吧! .java文件 int转成string类型:String s=String.valueOf(int m); String转成int类型:int m=Integer.parseI ...
- VMware虚拟机扩容--保姆级教学
由于项目逐步的完善,需要搭建的中间件,软件越来越多,导致以前虚拟机配置20G的内存不够用了,又不想重新创建新的虚拟机,退而求更精,选择扩容. 1.外部先进入虚拟机设置,将磁盘先扩展,具体提示如下图所示 ...
- [ARC152D] Halftree题解
很好的一道题,即使是我这种菜鸡也感到心潮澎湃. 直觉有余,证明不足.思路有余,推导不足. 无论是什么比赛,对拍都是最有效的查错方式. 本篇题解里的所有图片采用 graph_editor 制作. 题意简 ...
- Solon2 接口开发: 分布式 Api Gateway 开发预览
建议使用专业的分布式网关产品,比如: nginx apisix [推荐] k8s ingress controller 等... 对 Solon 来讲,只有 Gateway:它调用本地接口时,则为本地 ...
- Solon Initializr v1.2 发布
Solon Initializr 是 Solon 框架的模板生成器项目.本期更新增加了快捷组合包的依赖选择,并生成对应的项目模板. 更新说明 增加 Solon Lib 依赖选择,并生成对应项目 增加 ...
- 随机服务系统模拟—R实现(一)
排队论--随机服务系统 日常生活中存在大量有形和无形的排队或拥挤现象,如旅客购票排队,市内电话占线等现象.排队论的基本思想是 1909 年丹麦数学家.科学家,工程师 A. K. 埃尔朗在解决自动电话设 ...
- [Java]变量及其初始化 与 类对象的初始化
1 变量 1.1 变量的[定义] 1.2 变量的[作用域] 1.3 变量的[初始值] 1.4 补充:缓存变量 1.5 变量的[分类]与[未初始化情况] 2 类对象 2.1 类对象的初始化/构造过程 1 ...
- cf1809e(edu145e)
1 /* 2 _ooOoo_ 3 o8888888o 4 88" . "88 5 (| -_- |) 6 O\ = /O 7 ____/`---'\____ 8 .' \\| |/ ...