文章目录

  • 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)。

801. Minimum Swaps To Make Sequences Increasing相关推荐

  1. dp按照规模分类总结

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

  2. leetcode刷题规划

    LeetCode精华题目列表[刷题规划系列] – TuringPlanet 目录 算法题到底在考察什么? 题目列表 Array String Linked List Queue Stack Advan ...

  3. LeetCode All in One 题目讲解汇总(持续更新中...)

    原文地址:https://www.cnblogs.com/grandyang/p/4606334.html 终于将LeetCode的大部分题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开 ...

  4. 力扣算法题(11)动态规划

    70-Climbing Stairs (fibonacci数的矩阵计算) //假设你正在爬楼梯,有n阶,每次可以爬1或2阶,有多少种方法可以爬到楼顶. class solution70{int res ...

  5. asp子窗口读取父窗口数据_算法与数据结构基础 - 数组(Array)

    数组基础 数组是最基础的数据结构,特点是O(1)时间读取任意下标元素,经常应用于排序(Sort).双指针(Two Pointers).二分查找(Binary Search).动态规划(DP)等算法.顺 ...

  6. html字体大小vw,如何使用CSS vw尺寸单位实现响应式字体

    HTML 导入代码模板: Responsive fonts - auto-scaling root font-size The root font size scales up and down pr ...

  7. 论文笔记-Optimized flocking of autonomous drones in confined environments

    文章目录 个人总结 摘要 Introduction Flocking model instantiation through evolutionary optimization Scalability ...

  8. 序列号 oracle noorder,ORACLE序列的使用

    ORACLE序列的使用 1.Create Sequence 你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限, CREATE SEQUENCE emp_seque ...

  9. 2022 ICPC网络预选赛第二场 J A Game about Increasing Sequences 歪解

    方便起见,贴一下题面 题目链接:The 2022 ICPC Asia Regionals Online Contest (II) J题是个博弈论的结论题,比赛时死活想不出来.罚坐三小时很痛苦,没有办法 ...

最新文章

  1. Java Servlet完全教程
  2. Python学习一——Python下载安装
  3. Altium Designer中将FPGA引脚定义导出成文件
  4. 用nginx TCP反向代理作mail邮件代理
  5. Nacos 发布 1.0.0 GA 版本,可大规模投入到生产环境
  6. python下载大文件mp4_Python3 使用requests模块显示下载大文件显示进度
  7. 判断字符串解析是JsonObject或者JsonArray
  8. 算法分析-堆排序 HeapSort 优先级队列
  9. vba模拟鼠标点击_手把手教罗技鼠标宏挂通行证编程
  10. NetworkManager 替代工具 wicd
  11. object-c 字符串 c语言字符,Objective-C中字符串的拼接方法小结
  12. android 打开pdf文件
  13. 怎样用c语言画二次函数图像,已知函数表达式如何画图像
  14. 网站并发量的计算方法
  15. 制作一个谷歌浏览器插件,实现网页数据爬虫
  16. python中图形绘制技术的应用_python数据图形化—— matplotlib 基础应用
  17. 已知三角形三边求面积的c语言程序,已知三角形三边分别为4,5,6,求三角形的面积。用c语言编写程序...
  18. 智能门锁暗藏的物联网安全危机
  19. 2022跨境电商是宝还是坑-成都扬帆跨境电商
  20. 03709马原第三章考点总结

热门文章

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统(51)-系统升级
  2. DataTable操作
  3. 6月26号.NET面试题(程序题部分)只要做懂这3道题肯定能脱离菜鸟称号!
  4. Java 默认/缺省 内存大小,如果没有 -Xms -Xmx
  5. [BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]
  6. 类的序列化[Serializable]
  7. SpringBoot启动报错java.nio.charset.MalformedInputException: Input length = 2解决方案
  8. textview点击展开全部或收起,内容过长显示省略号,设置行间距,字间距,跑马灯显示
  9. mongoose 更新元素 DeprecationWarning: collection.update is deprecated. Use updateOne, updateMany
  10. webflux 对url参数的接收处理