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:

给定两个长度相等的整型数组 numstarget,要求将 nums 变为与 target 相似,并返回最少需要的操作次数。

具体地,每一次操作可以选择两个下标 ij,并满足以下条件:

  • 0 <= i,j < nums.length
  • nums[i] = nums[i] + 2nums[j] = nums[j] - 2

操作后,需要检查变换后的 nums 是否与 target 频率相等。如果是,则称 numstarget 是相似的,返回此时的操作次数。

按照题目描述实现过程可以分为以下几个步骤:

  1. 统计 numstarget 中所有元素出现的频率,然后比较两者是否相同。由于题目保证了 nums 可以变为 target 相似,因此这一步可以省略。
  2. numstarget 进行奇偶数值分离,将奇数值从偶数值中分离出来。这一步可以使用 split() 函数实现。
  3. numstarget 分别对奇数值和偶数值进行排序。这里可以使用 sort.Ints() 函数进行排序。
  4. 逐一比较 numstarget 中的对应元素,计算它们之间的差值的绝对值之和。这一步可以使用 abs() 函数和循环实现。
  5. 将差值的绝对值之和除以 4,即得到最少操作次数。

整个过程就是这样。具体来说,第二步和第三步是为了方便后面的比较和计算而进行的预处理。第四步是最重要的一步,需要仔细计算每一个位置上的差值,并将它们相加。第五步只是简单的除法运算,将计算结果转化为操作次数即可。

时间复杂度:

  • 对于奇偶数值分离的操作,需要遍历一遍数组,时间复杂度为 $O(n)$;
  • 对于排序操作和差值计算操作,需要遍历两次长度为 $n$ 的数组,时间复杂度为 $O(n \log n)$;
  • 因此,总的时间复杂度为 $O(n \log n)$。

空间复杂度:

  • 变量 numsOddSizelineans 占用常数级别的空间,不随输入规模变化,因此空间复杂度为 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的更多相关文章

  1. 输入两个正整数m和n,求其最大公约数和最小公倍数

    public static void main(String[] args){  Scanner sc = new Scanner (System.in);  int a,b;  System.out ...

  2. 一个数组nums,其中任意两个值等于给定值target,返回这两个值在nums里的位置

    package com.java.tencent; import java.lang.reflect.Array; import java.util.Arrays; import java.util. ...

  3. Ubuntu20.04/22.04 安装 Arduino IDE 2.x

    这周收到两片基于LGT8F328P LQFP32的Arduino Mini EVB, 机器上没有 Arduino 环境需要新安装, 正好感受一下新出的 Arduino IDE 2.x, 记录一下 Ub ...

  4. C语言实验报告(五) 两个正整数的最大公约数

    编程实现求两个正整数的最大公约数,要求计算最大公约数用函数fun(int a,int b)实现. #include<stdio.h>void main(){  int n,a,b;  in ...

  5. SDUT 3503 有两个正整数,求N!的K进制的位数

    有两个正整数,求N!的K进制的位数 题目链接:action=showproblem&problemid=3503">http://sdutacm.org/sdutoj/prob ...

  6. 代码代码:输入两个正整数m和n,求其最大公约数和最小公倍数。15 20 5

    import java.util.Scanner; //输入两个正整数m和n,求其最大公约数和最小公倍数.15 20 5 public class Test { public static void ...

  7. 今天遇到的面试题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" ...

  8. 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 ...

  9. 输入两个正整数num1、num2,计算并输出它们的和、差、积、整数商和余数

    课本例题 /*输入两个正整数num1.num2,计算并输出它们的和.差.积.整数商和余数.*/ #include<stdio.h> int main() { int num1, num2; ...

  10. VB6查看桌面分辨率和工作区大小 2022.08.22 name.vt

    VB6查看桌面分辨率和工作区大小 2022.08.22 name.vt Form1 内代码如下: ' 2022年8月22日 15时15分 ' 作者:name.vt Private Sub cmdCle ...

随机推荐

  1. You need to run build with JDK or have tools.jar on the classpath.If this occures during eclipse build make sure you run eclipse under JDK as well 错误

    我打开项目报错是这样的  pom.xml jdk配置什么的都是好的    但是还是报错 解决错误 : 1.打开你eclipse的根目录,找到eclipse.ini  这个文件夹打开 2.打开是这个样子 ...

  2. 学习记录--C++文件读入与存储

    C++中对文件操作需要包含头文件<fstream> 操作文件的三大类:1.ofstream写操作 2.ifstream读操作 3.fstream读写操作 一.写文件步骤 1.包含头文件 # ...

  3. springboot-项目获取resources下文件

    背景: 项目的resources 目录下放置了一份txt文件,需求是想获取到这份文件转成File对象,调用文件上传的接口进行文件上传操作. 实现: 1.使用 ResourceUtils:本地ok,测试 ...

  4. (转)解决ubuntu下拼音输入法出错的问题

    一.如果仅在中文输入法下出现按键映射错位而英文输入下正常的情况,则在终端下输入以下命令即可: ibus-daemon -drx 二.如果拼音正常但打出来显示 "[Invalid UTF-8] ...

  5. instanceof与类型转换

    instanceof与类型转换 package com.andy.base.oop.demo01.demo06; public class Teacher extends Person { } pac ...

  6. python通过轮子安装第三方库(以Wordcloud为例)

    1.查看python版本 直接输入如下命令: python 执行结果如下: 我们可以直到,本机的python版本为: AMD64bit 3.11版本python 2.下载合适python版本的轮子 下 ...

  7. Leftpad事件 我们是不是早已忘记该如何好好地编程?

    多年前的Leftpad 撤包事件使得React . Babel 和许多流行的npm模块都受到波及,无法正常运行. 这些受到影响的模块都引入了一个叫做 left-pad 的模块. 以下就是这十一行代码: ...

  8. Spring--依赖注入:setter注入和构造器注入

    依赖注入:描述了在容器中建立Bean于Bean之间依赖关系的过程 setter注入 在本来已经在service里面引用了bean的相关方法的基础上,再引用之前已经写过的userDao的对象,即在ser ...

  9. Mathematica的Combinatorica`程序包使用笔记

    目录 官方给出的程序包使用指南和一些示例 引论 步骤 0x00 导入程序包 0x01 Integer Partitions 0x02 Integer Compositions 0x03 partiti ...

  10. Solon Initializr v1.2 发布

    Solon Initializr 是 Solon 框架的模板生成器项目.本期更新增加了快捷组合包的依赖选择,并生成对应的项目模板. 更新说明 增加 Solon Lib 依赖选择,并生成对应项目 增加 ...