博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
荷兰国旗问题------排序3
阅读量:3937 次
发布时间:2019-05-23

本文共 1043 字,大约阅读时间需要 3 分钟。

问题一   

给定一个数组arr,和一个数num,请把小于等于num的数放在数 组的左边,大于num的数放在数组的右边。

要求额外空间复杂度O(1),时间复杂度O(N)

思路:遍历的过程指针指向的位置如果小于等于num,则小于等于区域的下一个数和  遍历过程的指针指向的数进行交换

 

问题二

(荷兰国旗问题) 给定一个数组arr,和一个数num,请把小于num的数放在数组的 左边,等于num的数放在数组的中间,大于num的数放在数组的 右边。

要求额外空间复杂度O(1),时间复杂度O(N)

要求额外空间复杂度O(1)即不用额外的辅助数据结构,只用有限几个变量

时间复杂度O(N)即遍历数组的次数是固定的

less指针指向小于等于num区域,more指针指向大于等于num区域。current指针进行遍历。

1)current指针遍历过程指向的数如果小于num,小于等于区域的下一个数和current指向的数进行交换,current++,less++

2)current指针遍历过程指向的数如果大于num,more指针(大于等于区域)的下一个数和current指向的数进行交换,再次判断current指向的数的值是否大于num,如果大于,继续和more指针(大于等于区域)的下一个数进行交换。

3)如果current指针指向的数和num相等,则current++。

具体代码如下:

public static int[] partition(int[] arr, int l, int r, int num) {   int less = l - 1;   int more = r + 1;   while (l < more) {      if (arr[l] < num) {         swap(arr, ++less, l++);      } else if (arr[l] > num) {         swap(arr, --more, l);      } else {         l++;      }   }   //等于区域的边界   return new int[] { less + 1, more - 1 };}// for testpublic static void swap(int[] arr, int i, int j) {   int tmp = arr[i];   arr[i] = arr[j];   arr[j] = tmp;}

转载地址:http://inuwi.baihongyu.com/

你可能感兴趣的文章
springCloud升级到Finchley.RELEASE,SpringBoot升级到2.0.4
查看>>
Spring boot + Arthas
查看>>
omitted for duplicate jar包冲突排查
查看>>
如何保证缓存与数据库的双写一致性?
查看>>
java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy排查
查看>>
深浅拷贝,深浅克隆clone
查看>>
Java基础零散技术(笔记)
查看>>
Mysql优化sql排查EXPLAIN EXTENDED
查看>>
线程之间数据传递ThreadLocal,InheritableThreadLocal,TransmittableThreadLocal
查看>>
spring循环依赖,解决beans in the application context form a cycle
查看>>
分布式锁的实现
查看>>
解决POJO的属性首字母为大写,但是赋值不了的问题
查看>>
服务器运维整理(笔记)
查看>>
redis分布式锁在MySQL事务代码中使用,没控制好并发原因
查看>>
centos7中的网卡一致性命名规则、网卡重命名方法
查看>>
能切换环境的python
查看>>
Tmux 使用教程
查看>>
DLINK-DSN1100的安装使用记录
查看>>
openssl的学习
查看>>
watchguard ssl100恢复出厂化设置
查看>>