荷兰国旗问题

荷兰国旗问题

  • 问题:给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于sum的数放在数组的中间,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度为O(N)。由于荷兰的国旗是三个颜色刚好对应三个部分,因此也叫荷兰国旗问题。
  • 思路:引入两个具有指向性的变量,分别指向数组开头和结尾。i从数组开头进行遍历,如果小于sum则与指向开头的变量互换,变量指向右移,i++;如果等于sum,则仅执行i++;如果大于sum,则与指向结尾的变量互换位置,变量指向左移,不执行i++操作。重复执行,直到i 与 右边的指向变量重合。

代码实现

package LeetCode;

/**
 * @Description:
 * @ProjectNmae: gitTest
 * @PackageName: LeetCode
 * @ClassName: DutchFlag
 * @Author: Y-peak
 * @Date: 2021.08.28 22:07   星期六
 */

public class DutchFlag {
    public static void dutchFlag(int[] arr, int num){
        int left, right, i,temp;
        left = i = 0;
        right = arr.length - 1;
        while (i != right){
            if(arr[i] < num){
                temp = arr[i];
                arr[i] = arr[left];
                arr[left] = temp;
                left++;
                i++;
            }
            if (arr[i] == num)
                i++;
            if (arr[i] > num) {
                temp = arr[i];
                arr[i] = arr[right];
                arr[right] = temp;
                right--;
            }
        }
    }
    public static void main(String[] args) {
        int[] arr = new int[]{2,3,4,8,10,1,13,34,14,13,20,7};
        dutchFlag(arr,13);
        for(int i : arr){
            System.out.println(i);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值