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

题目要求:

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

代码实现:

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];
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值