2023-02-16:两种颜色的球,蓝色和红色,都按1~n编号,共计2n个,
为方便放在一个数组中,红球编号取负,篮球不变,并打乱顺序,
要求同一种颜色的球按编号升序排列,可以进行如下操作:
交换相邻两个球,求最少操作次数。
[3,-3,1,-4,2,-2,-1,4]、
最终交换结果为:
[1,2,3,-1,-2,-3,-4,4]。
最少交换次数为10,
n <= 1000。

答案2023-02-16:

动态规划,IndexTree。

代码用rust编写。代码如下:

use std::collections::HashMap;
use std::iter::repeat;
fn main() {
let mut arr = vec![3, -3, 1, -4, 2, -2, -1, 4];
println!("{}", min_swaps(&mut arr));
} // [3,-3,1,-4,2,-2,-1,4]
// -3 -4 -2 -1 -> -1 -2 -3 -4
// 3 1 2 4 -> 1 2 3 4 // 这个题写对数器太麻烦了
// 所以这就是正式解
fn min_swaps(arr: &mut Vec<i32>) -> i32 {
let n = arr.len() as i32;
let mut map: HashMap<i32, i32> = HashMap::new();
let mut top_a = 0;
let mut top_b = 0;
for i in 0..n {
if arr[i as usize] > 0 {
top_a = get_max(top_a, arr[i as usize]);
} else {
top_b = get_max(top_b, abs(arr[i as usize]));
}
map.insert(arr[i as usize], i);
}
let mut it = IndexTree::new(n);
for i in 0..n {
it.add(i, 1);
}
return f(top_a, top_b, &mut it, n - 1, &mut map);
} // 可以改二维动态规划!
// 因为it的状态,只由topA和topB决定
// 所以it的状态不用作为可变参数!
fn f(top_a: i32, top_b: i32, it: &mut IndexTree, end: i32, map: &mut HashMap<i32, i32>) -> i32 {
if top_a == 0 && top_b == 0 {
return 0;
}
let mut p1 = i32::MAX;
let mut p2 = i32::MAX;
let mut index: i32;
let mut cost: i32;
let mut next: i32;
if top_a != 0 {
index = *map.get(&top_a).unwrap();
cost = it.sum(index, end) - 1;
it.add(index, -1);
next = f(top_a - 1, top_b, it, end, map);
it.add(index, 1);
p1 = cost + next;
}
if top_b != 0 {
index = *map.get(&(-top_b)).unwrap();
cost = it.sum(index, end) - 1;
it.add(index, -1);
next = f(top_a, top_b - 1, it, end, map);
it.add(index, 1);
p2 = cost + next;
}
return get_min(p1, p2);
}
fn get_max<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {
if a > b {
a
} else {
b
}
} fn get_min<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {
if a < b {
a
} else {
b
}
} fn abs(a: i32) -> i32 {
if a < 0 {
-a
} else {
a
}
}
struct IndexTree {
tree: Vec<i32>,
nn: i32,
}
impl IndexTree {
pub fn new(size: i32) -> Self {
Self {
tree: repeat(0).take((size + 1) as usize).collect(),
nn: size,
}
} pub fn add(&mut self, mut i: i32, v: i32) {
i += 1;
while i <= self.nn {
self.tree[i as usize] += v;
i += i & -i;
}
} pub fn sum(&mut self, l: i32, r: i32) -> i32 {
return if l == 0 {
self.sum0(r + 1)
} else {
self.sum0(r + 1) - self.sum0(l)
};
} fn sum0(&mut self, mut index: i32) -> i32 {
let mut ans = 0;
while index > 0 {
ans += self.tree[index as usize];
index -= index & -index;
}
return ans;
}
}

2023-02-16:两种颜色的球,蓝色和红色,都按1~n编号,共计2n个, 为方便放在一个数组中,红球编号取负,篮球不变,并打乱顺序, 要求同一种颜色的球按编号升序排列,可以进行如下操作: 交换相邻的更多相关文章

  1. 【leetcode】Merge Sorted Array(合并两个有序数组到其中一个数组中)

    题目: Given two sorted integer arrays A and B, merge B into A as one sorted array. Note: You may assum ...

  2. C语言:一个数组中只有两个数字是出现一次

    //1.一个数组中只有两个数字是出现一次, //其他所有数字都出现了两次. //找出这两个数字,编程实现.a //^=单独两个数的^结果 //单独出现的两个数不同位的标记 //position: ^结 ...

  3. 选取两个有序数组中最大的K个值,降序存入另一个数组中

    原题: 假设有两个有序的整型数组int *a1, int *a2,长度分别为m和n.试用C语言写出一个函数选取两个数组中最大的K个值(K可能大于m+n)写到int *a3中,保持a3降序,并返回a3实 ...

  4. C#把某个数组的一部分复制到另一个数组中的两种方法:Buffer.BlockCopy和Array.Copy

    static void Main(string[] args) { , , , , , }; ;//目标数组大小 int int_size = sizeof(int);//用于获取值类型的字节大小. ...

  5. JS判断一个数组中是否有重复值的三种方法

    方法一: var s = ary.join(",")+","; for(var i=0;i<ary.length;i++) { if(s.replace( ...

  6. js中关于一个数组中最大、最小值以及它们的下标的输出的一种解决办法

    今天在学习js中的数组时,遇到的输出一个数组中最大.最小值以及它们的下表,以下是自己的解决方法! <script type="text/javascript"> var ...

  7. 一个数组中两个数的和为N,找出这两个数字的下标

    分析,两个数字的和为N.那么这两个数字是否是唯一的呢?输出的下标是否是第一对出现的呢? 1,我们假设这两个数字是唯一的 和是唯一的,那么其中一个数字越大,另一个数字就越小.想到大小关系,我们就想到了排 ...

  8. 把两个table放在一个Repeater中显示

    DataTable dt; DataTable dt1; HLoanApplyInfo applyInfo = HLoanApplyBll.GetModelById(FLoanID); FLoanID ...

  9. 数组中的数分为两组,让给出一个算法,使得两个组的和的差的绝对值最小,数组中的数的取值范围是0<x<100,元素个数也是大于0, 小于100 。

    比如a[]={2,4,5,6,7},得出的两组数{2,4,6}和{5,7},abs(sum(a1)-sum(a2))=0: 比如{2,5,6,10},abs(sum(2,10)-sum(5,6))=1 ...

  10. 【LeetCode每天一题】Median of Two Sorted Arrays(两数组中的中位数)

    There are two sorted arrays nums1 and nums2 of size m and n respectively.  Find the median of the tw ...

随机推荐

  1. PyQt5高级窗口组件

    https://blog.csdn.net/A642960662/article/details/123093350?utm_medium=distribute.pc_aggpage_search_r ...

  2. 3---java中的集合

    集合是什么:表示一组元素的对象,有的是有序的,有的是无序的,有的是可重复的,有的是不可重复的. 首先根是:Collection 1:Set 没有重复元素  SortedSet 有序的Set 2:Lis ...

  3. (2)请用requests库的get()函数访问如下一个网站20次,打印返回状态,text()内容,计算text()属性和content属性所返回网页内容的长度。

    # 导入库 import requests from bs4 import BeautifulSoup def getUrlText(url): try: web = requests.get(url ...

  4. Sleuth 使用

    sleuth是spring cloud中日志链(调用链解决方案),自动添加traceId,spanId. sleuth包也可单独引入,和其它藕合度小.sleuth + zipkin 实现APM管理. ...

  5. Java - JDBC批量插入原理

    一.说明 在JDBC中,executeBatch这个方法可以将多条dml语句批量执行,效率比单条执行executeUpdate高很多,这是什么原理呢?在mysql和oracle中又是如何实现批量执行的 ...

  6. 记录一次线上gitlab11.x升级gitlab14.x版本操作

    前言:gitlab11升级到14还是有挺多需要注意的坑,也算是做一次积累吧,升级前后,gitalb的WEB界面也变化了很多,升级过程需要注意的地方我放到最后说明,挺关键的 一.首先需要下载好要升级的包 ...

  7. 【问题解决】Nacos服务端NVDB-CNVDB-2023674205漏洞

    缘起 最近(2023.03.13)客户现场要求自检有无使用Nacos,原因是Nacos存在认证绕过高危漏洞,其漏洞代码NVDB-CNVDB-2023674205,本文就简单说一下这个事儿,以及如何解决 ...

  8. 使用ELRepo升级CentOS内核

    在腾讯云中部署了一些服务器,操作系统使用的是CentOS 7.6,但是其默认内核版本较低,现使用ELRepo对CentOS的内核进行升级. 操作环境 服务器:腾讯云轻量应用服务器 操作系统:CentO ...

  9. MGF multivariate generating function 多变量生成函数

    目录 MGF多变量生成函数multivariate generating function 定义 例子 Extremal parameters III.8.1 largest components 例 ...

  10. Java 面试——Zookeeper

    一.Zookeeper 实现机制 文件系统 + 通知机制 二.Zookeeper 高可用实现原理 一个 ZooKeeper 集群如果要对外提供可用的服务,那么集群中必须要有过半的机器正常工作并且彼此之 ...