【编程题】荷兰国旗问题(java实现)
2019-08-12 19:35
176 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40432108/article/details/99327536
【编程题】荷兰国旗问题(java实现)
题目描述
给定一个数组arr和一个数num,请把小于num是数放在数组的左边,等于num的数放在数组的中间,大于num是数放在数组的右边,要求额外空间为o(1),时间为o(n)
例如:
arr={4,5,6,7,5,1,2,3}
num=5
输出
0, 3, 2, 1, 5, 5, 7, 6
代码
import java.util.Arrays; public class HeLanGuoQi { public static void main(String[] args){ int[] arr={4,5,6,7,5,1,2,3}; rotate(arr,5); System.out.println(Arrays.toString(arr)); } static void rotate(int[] arr,int num){ if(arr==null||arr.length<=0)return; int left=-1,right=arr.length,current=0; while (current<right){ if(arr[current]<num){ left++; swap(arr,left,current); current++; } else if(arr[current]==num){ current++; }else { right--; swap(arr,current,right); } } } static void swap(int[] arr,int i,int j){ int temp=arr[j]; arr[j]=arr[i]; arr[i]=temp; } }
改造题目
给定一个数组arr和一个数num,请把小于等于num是数放在数组的左边大于num是数放在数组的右边,要求额外空间为o(1),时间为o(n)
例如:
arr={4,5,6,7,5,1,2,5}
num=5
输出
0, 0, 5, 1, 2, 5, 6, 7
代码
import java.util.Arrays; public class NewHeLan { public static void main(String[] args){ int[] arr={4,5,6,7,5,1,2,5}; rotate(arr,5); System.out.println(Arrays.toString(arr)); } static void rotate(int[] arr,int num){ if(arr==null||arr.length<=0)return; int left=-1,current=0,len=arr.length; while (current<len){ if(arr[current]<=num){ left++; swap(arr,left,current); current++; } else { current++; } } } static void swap(int[] arr,int i,int j){ int temp=arr[j]; arr[j]=arr[i]; arr[i]=temp; } }
改题目
快排的partition函数
从数组的l位置到r位置,实现荷兰国旗问题,返回等于区域的左右边界
代码
import java.util.Arrays; public class Partition { public static void main(String[] args){ int[] arr={4,5,6,7,5,1,2,3}; System.out.println(Arrays.toString(partition(arr,0,arr.length-1,5))); System.out.println(Arrays.toString(arr)); } static int[] partition(int[] arr,int low,int high,int num){ if(arr==null||arr.length<=0)return null; int left=low-1,right=high+1,current=low; while (current<right){ if(arr[current]<num){ left++; swap(arr,left,current); current++; } else if(arr[current]==num){ current++; }else { right--; swap(arr,current,right); } } return new int[] {left+1,right-1}; } static void swap(int[] arr,int i,int j){ int temp=arr[j]; arr[j]=arr[i]; arr[i]=temp; } }
相关文章推荐
- 《剑指offer》编程题java实现(六):斐波那契数列系列问题
- C/C++数据结构-用单链表实现荷兰国旗问题
- 荷兰国旗问题的算法实现
- 剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现
- 荷兰国旗问题java
- 《剑指offer》编程题java实现(七):丑数问题
- 第十五题:荷兰国旗问题(java)
- 荷兰国旗问题---C++和JAVA
- 算法笔记_051:荷兰国旗问题(Java)
- 第二十题:链表的荷兰国旗问题(Java)
- 0/1背包问题的动态规划法求解 —— Java 实现
- 同样一个问题的两种 java 实现代码 的比较
- 完全背包问题(Java实现)
- 回溯法求解N人分N本书的问题(Java实现)
- 生产者与消费者问题(java多线程实现)
- 百钱买百鸡问题--java 实现
- 八皇后问题的java实现
- js,java实现escape()和unescape()函数解决以给方式提交中中文参数问题
- 蛮力法和分治法 求最近对问题——Java 实现
- 背包问题-贪心法-java实现