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. 干货来袭!3天0基础Python实战项目快速学会人工智能必学数学基础全套(含源码)(第3天)概率分析篇:条件概率、全概率与贝叶斯公式

    第1天:线性代数篇:矩阵.向量.实战编程 第2天:微积分篇:极限与导数.梯度下降.积分.实战编程 第3天:概率分析篇:条件概率与全概率.贝叶斯公式.实战项目 目录 前言 一.概率与机器学习 1.1 概 ...

  2. Python——高级数据类型(七)

    1. 列表数据类型的声明与访问 # coding=utf-8 #列表数据类型的声明与访问 my_list =[1,2,3,4,5] # 列表中的元素 print (my_list) # 0 1 2 3 ...

  3. Navicate 远程连接Mysql数据库

    123步骤是在服务器上运行,第四步是在本机的navicate上运行 1.use mysql 2.update user set host = '%' where user = 'root' 3.flu ...

  4. fullcalendar 日历插件的使用

    [需求]:使用 fullcalendar日历插件,完成如下功能:可以进行拖动,点击空白处添加,双击后修改和删除等功能.API 链接

  5. 为什么HashMap查找比List快很多?

    做两数之和这道题目时,引发了一个思考: 为什么两者运行时间相差如此之大???好残忍,我List比你HashMap到底差在哪**** 于是我一顿查资料.... 战犯哈希算法登场 哈希算法会根据你要存入的 ...

  6. 系统优化脚本支持Ubuntu和CentOS

    系统优化脚本支持Ubuntu和CentOS 经常会部署各种用途的操作系统,但在这些工作中,我们会发现很多工作其实是重复性的劳动,操作的内容也是大同小异,基于这类情况,我们可以把相同的操作做成统一执行的 ...

  7. 在Ubuntu 18.04上安装NVIDIA

    安装NVIDIA显卡驱动风险极大,新手注意. 在Ubuntu 18.04上安装NVIDIA有三种方法: 使用标准Ubuntu仓库进行自动化安装 使用PPA仓库进行自动化安装 使用官方的NVIDIA驱动 ...

  8. python实现往飞书群发图片及消息

    飞书提供了丰富的api来实现消息的通知,包括文本消息.图片消息.富文本消息,本次介绍使用飞书api发送富文本消息,以下是实现思路飞书API地址:https://open.feishu.cn/docum ...

  9. xtrabackup: error: xb_load_tablespaces() failed with error code 57

    问题描述:在数据库上运行xtrabackup备份脚本出现的一些报错 DB_version:mysql8.0.26 Xtrabackup:percona-xtrabackup-8.0.27-19-Lin ...

  10. pandas小技巧

    1. 删除列 import pandas as pd df.drop("Unnamed: 0", axis=1, inplace=True) 2. 转换列的格式 df[" ...