801. Minimum Swaps To Make Sequences Increasing

文章目录

  • 1题目理解
  • 2 暴力搜索
  • 3 动态规划
    • 3.1第一种情况
    • 3.2第二种情况

1题目理解

输入:两个int数组A和B,长度都不为0,并且长度相同。
输出:最小交换次数。
规则:最终想要得到两个严格递增的数组。如果原始数组不符合要求,可以在相同的位置交换A、B数组元素。也就是说可以交换A[i]和B[i],使得数组严格递增。并且题目可以保证输入的数组是有效的数组。
例子:
Input: A = [1,3,5,4], B = [1,2,3,7]
Output: 1
Explanation:
交换 A[3] and B[3]得到的序列是:
A = [1, 3, 5, 7] and B = [1, 2, 3, 4]
它们都是严格递增的.

2 暴力搜索

这道题目一眼是看不出递归方程的,所以只能从暴力搜索开始。
我们每次比较第i位元素:如果 A[i]<=A[i-1] 或者 B[i]<=B[i-1] ,那这个时候不符合条件,是一定要交换A[i]和B[i]的。其他情况下,A[i]和B[i]可以交换也可以不交换。当i=0的时候,A[i]和B[i]也是可以交换也可以不交换。
一直比较到数组长度的时候,记录最小交换次数。
因为每个位置都有2种选择,所以时间复杂度是O(n2)O(n^2)O(n2)

class Solution {private int result;public int minSwap(int[] A, int[] B) {result = A.length;minSwap(A,B,0,0);return result;}private void minSwap(int[] A ,int[] B,int index,int swapCount){if(index >= A.length){result = Math.min(result,swapCount);}else{if(index >0 && (A[index]<=A[index-1] || B[index]<=B[index-1])){//必须换swap(A,B,index);if(A[index]<=A[index-1] || B[index]<=B[index-1]){swap(A,B,index);  return;}minSwap(A,B,index+1,swapCount+1);swap(A,B,index);                }else{minSwap(A,B,index+1,swapCount);swap(A,B,index);if(index>0 && (A[index]<=A[index-1] || B[index]<=B[index-1])){swap(A,B,index);return;}minSwap(A,B,index+1,swapCount+1);swap(A,B,index);}}}private void swap(int[] A,int[]B,int index){int t = A[index];A[index] =  B[index];B[index] = t;}
}

当这样写完代码之后提交肯定超时。但是根据这个却不知道怎么写递归方程。

3 动态规划

既然根据暴力找不到方程,那就再分析。严格递增是A[i]>A[i-1],所以在考虑第i步的最小交换次数的时候,只需要考虑第i-1步的最小交换次数以及大小关系。
我们令keep[i]表示从0到i是严格递增序列需要交换的最少次数,并且A[i]和B[i]不交换。令swap[i]表示从0到i是严格递增序列需要交换的最少次数,并且A[i]和B[i]交换。
在例子中
1 3 5
1 2 3

3.1第一种情况

当i=2的时候,A[i]>A[i-1] 并且B[i]>B[i-1],在这种状态下A[i]、B[i]可以交换也可以不交换。
如果A[i]、B[i]不交换,那A[i-1]、B[i-1]也应该不换。如果一换的话可能就不是严格递增子序列了。例如3和2换了,5和3不换,那序列变为1 2 5和 1 3 3。这样是不符合要求的。所以keep[i]=keep[i-1],
如果A[i]、B[i]交换,那A[i-1]、B[i-1]也应该交换。例如5和3换了,3和2不换,那序列变为1 3 3和1 2 5。不符合要求。所以swap[i] = swap[i-1]+1。

3.2第二种情况

我们再考虑A[i]和B[i-1]的关系。如果A[i]>B[i-1]并且B[i]>B[i-1]。
在例子中
1 3 5 4
1 2 3 7
在当i=3的时候,就符合这种情形。我们同样考虑A[i]、B[i]交换,不交换两种情况。
如果A[i]、B[i]不交换,那么A[i-1]、B[i-1]应该交换。如果不交换是可能不符合要求的。例子中5和3不交换,4和7也不交换,那结果不符合要求。所以keep[i] = swap[i-1]。
如果A[i]、B[i]交换,那A[i-1]、B[i-1]应该不交换。同样换一下,不符合要求(1 3 3 7,1 2 5 4)我们只比较最后两位。所以swap[i] = keep[i] + 1。

接着考虑A[i]>A[i-1] 并且B[i]>B[i-1] 和 A[i]>B[i-1]并且B[i]>A[i-1]应该是可能同时出现。所以在考虑第二种情况下的计算式的时候,需要改变一下。keep[i] = min(keep[i],swap[i-1]) , swap[i] = min(swap[i],keep[i] + 1)。

题目思路来源于花花酱

开始写代码吧。

class Solution {private int result;public int minSwap(int[] A, int[] B) {int n = A.length;int[] swap = new int[n];int[] keep = new int[n];swap[0] = 1;for(int i = 1;i<n;i++){swap[i] = n;keep[i] = n;if(A[i] > A[i-1] && B[i] > B[i-1]){keep[i] = keep[i-1];swap[i] = swap[i-1] + 1;}if(A[i]>B[i-1] && B[i]>A[i-1]){keep[i] = Math.min(keep[i],swap[i-1]);swap[i]  =  Math.min(swap[i],keep[i-1]+1);}}return  Math.min(swap[n-1],keep[n-1]);}}

时间复杂度O(n)。空间复杂度可以优化为O(1)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用属性还是字段?

用属性还是字段&#xff1f; 我觉得对于实体类(没有方法的类)&#xff0c;只要用字段就好了&#xff0c;没必弄得像下面这个样子&#xff1a; private AttributeConfig m_ColumnMap;public AttributeConfig ColumnMap{get{return m_ColumnMap;}set{m_ColumnMapvalue;}}posted …

spring mvc学习(7):springmvc学习笔记(常用注解)

1. Controller Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用Controller注解定义的控制器有如下特点: 不需要继承任何类, 也不需要实现任何接口可以处理多个请求可以使用Servlet的相关特性 spring自动扫描所有基于注解的类, 并将其注册为spring…

模板——树状数组求逆序对

题目链接&#xff1a;https://www.luogu.org/problemnew/show/P1908 1 #include <map>2 #include <set>3 #include <cmath>4 #include <queue>5 #include <string>6 #include <cstdio>7 #include <cstring>8 #include <iostream&…

818. Race Car

文章目录1 题目理解2 BFS3 dp3.1 基本情况3.2 递归方程分析3.2.1 先超过target再调头3.2.2 不超过target4 说明1 题目理解 先讲规则。一辆小汽车停在位置0&#xff0c;并且方向朝向右侧&#xff0c;并且速度为1。小汽车每次可以选择加速A&#xff0c;那加速一次&#xff0c;新…

spring mvc学习(8):springmvc常用注解代码

目录结构 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://java.sun.com/xml/ns/javaee" xsi:schemaLocation"http://java.sun.com/xml…

找了好久的BUG

找了好久的BUG <rsp:WEBPAGE id"PageContainer" TabSectionID"*****" runat"server"></rsp:WEBPAGE> <rsp:PLACEHOLDER id"AdminPage_Title" runat"server">公文流转流程工作点定义</rsp:PLACEHOLDER&…

python-if条件判断与while/for循环

条件判断if 让计算机像人一样&#xff0c;能判断是非对错&#xff0c;根据条件做一些事情。 if ------ if代码结构&#xff1a;------- if 条件:代码体tips&#xff1a;同一缩进范围内的代码被视作同一代码体,python官方推荐python缩进一次为4个空格is_happy True if is_happ…

第八十二期:掌握这些监控报警优化技巧,百万年薪不在话下!

运维工程师面试者第一个问题是&#xff1a;需要值班吗?笔者自己也曾经历过月入十万的时期&#xff0c;在那个时候&#xff0c;数个系统同时发布下一代版本&#xff0c;而老系统还需要过渡很长时间&#xff0c;工作量直接翻倍。 作者&#xff1a;焦振清 运维工程师面试者第一…

dp按照规模分类总结

本文章的内容来源于花花酱dp2。 做多了dp的题目之后总觉得有什么规律&#xff0c;但是自己没总结出来。花花酱按照输入规模、子问题个数、在解决一个问题的时候需要依赖的子问题个数为特征对题目做了分类。 其中绿色是比较简单的 &#xff0c;黄色是中等的&#xff0c;粉色是…

看了交大自产的电影《我的太阳》

呵呵&#xff0c;现在大学生自导自拍自演的电影越来越多了&#xff0c;不知道算是中国第几代导演&#xff1a;&#xff09; 我看电影一般比较关注情节&#xff0c;演技暂且不提。因为是校园电影&#xff0c;本片自然比较接近大学生生活&#xff0c;总体情节比较浪漫曲折(虽然部…

【BZOJ4559】【JLOI2016】—成绩比较(拉格朗日插值+dp)

传送门 dpdpdpf[i][j]f[i][j]f[i][j]表示前iii门课&#xff0c;有jjj个人没有被碾压的方案数 考虑f[i−1][j]f[i-1][j]f[i−1][j]转移到f[i][w](j≤w)f[i][w](j\le w)f[i][w](j≤w) 首先要选出w−jw-jw−j个新的没被他碾压的人 由于之前已经有一些没被碾压的人,所以方案数为(n−…

中兴通讯 基于定位的技术和市场分析

中兴通讯 基于定位的技术和市场分析 (2004-08-10 09:04:27) 8月5日&#xff0c;由中国联通和中兴通讯联合举办的“中国联通位置业务研讨会”在海口举行。中国联通总部及多个省的分公司领导&#xff0c;应用中兴通讯PN4747定位系统开展定位业务的多家集团客户代表以及华好…

第八十三期:这些高性能负载均衡架构知识点,90%的人分不清!

单服务器无论如何优化&#xff0c;无论采用多好的硬件&#xff0c;总会有一个性能天花板&#xff0c;当单服务器的性能无法满足业务需求时&#xff0c;就需要设计高性能集群来提升系统整体的处理性能。 作者&#xff1a;马天池 单服务器无论如何优化&#xff0c;无论采用多好…

15. 3Sum-数组

文章目录1题目理解2 排序双指针1题目理解 输入&#xff1a;int数组nums 规则&#xff1a;查找数组中任意三个数的和等于0 输出&#xff1a;符合条件的解&#xff0c;不包含重复的解 例子&#xff1a; nums [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1…

第八十四期: Java、Web 和移动程序员学习的 12 个框架

今天的文章中&#xff0c;我将分享一些你可以学习的框架&#xff0c;以提升你在移动和Web开发以及大数据技术方面的知识。 作者&#xff1a;芒果教你学编程 在今天的文章中&#xff0c;我将分享一些你可以学习的框架&#xff0c;以提升你在移动和Web开发以及大数据技术方面的…

关于mysql无法添加中文数据的问题以及解决方案

所有能设置的地方我都设置了&#xff0c;都设置的是ut8。然后&#xff0c;我执行了一下insert语句&#xff0c;报错了&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 这个错误纠结了一天&#xff0c;最后&#xff0c;看到…

第八十五期:一文彻底搞懂cookie和session

在Web发展史中&#xff0c;我们知道浏览器与服务器间采用的是 http协议&#xff0c;而这种协议是无状态的&#xff0c;所以这就导致了服务器无法知道是谁在浏览网页&#xff0c;所以为了解决这一问题&#xff0c;先后出现了四种技术&#xff0c;分别是隐藏表单域&#xff0c;UR…

141. Linked List Cycle

文章目录1 题目理解2 分析13 分析21 题目理解 输入&#xff1a;一个单向链表。 输出&#xff1a;如果链表中有环&#xff0c;输出true。否则输出false。 规则&#xff1a;单向链表只能向前移动。 2 分析1 可以把节点放入map中&#xff0c;不断遍历。如果碰到已经遍历的节点&…

Microsoft Updater Application Block 1.5.3 服务器端manifest文件设计 [翻译]

Microsoft Updater Application Block 服务器端manifest文件设计 译者&#xff1a;Tony Qu Manfest文件用于列出一次升级所需要的所有的文件&#xff0c;它与验证签名相关联&#xff0c;验证签名可用于验证manifest文件的真实性。这个将介绍应用程序升级器的以下几个方面&#…

第八十六期:“程序员锁死服务器导致公司倒闭”案正式开庭审理

11 月 1 日&#xff0c;据微博网友爆料&#xff0c;此前程序员锁死服务器致创业游戏公司倒闭一案已经开庭审理&#xff0c;公司创始人“螃了个蟹” 提交了对方莫名失联&#xff0c;跑路的证据。 作者&#xff1a;51CTO 11 月 1 日&#xff0c;据微博网友爆料&#xff0c;此前…