您的位置:首页 > 编程语言 > Java开发

第十五题:荷兰国旗问题(java)

2019-01-14 19:30 211 查看
版权声明:Please make the source marked https://blog.csdn.net/qq_31807385/article/details/86482322

题目要求:

给定一个数组,将这个数组,按照num划分,小于num的元素放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。要求时间复杂度是O(N),额外空间复杂度是O(1)

代码实现:

[code]package com.isea.brush;

/**
* 荷兰国旗问题:
* 解题思路:使用两个变量(指针),less 和more,less表示小于num的范围,more表示的是大于num的范围
* 起始值分别为-1,和R+1,如果当前元素比num大,那么和more的前一个位置交换位置,交换之后,继续和num比较
* 如果比当前元素要小,和less的后一个位置交换,而且当前位置需要向下移动
*/
public class NetherlandsFlag {

/**
* 求在arr的L~R范围内的荷兰国旗问题
* @param arr
* @param L
* @param R
* @param num
* @return  返回等于num位置的起始和终点的位置
*/
public static int[] solution(int[] arr,int L, int R , int num){
int less = -1;
int more = R + 1;
while(L < more){ // 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};
}

public static void swap(int[] arr,int i ,int j){
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: