zoukankan      html  css  js  c++  java
  • 荷兰国旗划分


    /**
    * 荷兰国旗划分
    * <p>
    * 给定一个数组和一个整数num,请把小于num的数放在数组的左边,把等于num的数放在数组的中间,把大于num的数放在数组的右边(不要求整体有序)
    */
    public class NetherlandFlag {

    /**
    * 荷兰国旗划分 以arr[right] 为划分值
    *
    * @param arr 数组
    * @param left 左边界
    * @param right 右边界
    * @return 等于区域的下标范围
    */
    public static int[] netherlandFlag(int[] arr, int left, int right) {
    if (left > right) {
    return new int[]{-1, -1};
    }
    if (left == right) {
    return new int[]{left, right};
    }
    int less = left - 1;
    int more = right;
    int index = left;
    while (index < more) {
    if (arr[index] < arr[right]) {
    swap(arr, index++, ++less);
    } else if (arr[index] > arr[right]) {
    swap(arr, index, --more);
    } else {
    index++;
    }
    }
    swap(arr, more, right);
    return new int[]{less + 1, more};
    }

    /**
    * 交换数组两个元素的位置
    *
    * @param arr 数组
    * @param i 位置
    * @param j 位置
    */
    private static void swap(int[] arr, int i, int j) {
    // 同一个位置交换无意义,并且用异或交换会有问题
    if (i == j) {
    return;
    }
    // 交换
    arr[i] = arr[i] ^ arr[j];
    arr[j] = arr[i] ^ arr[j];
    arr[i] = arr[i] ^ arr[j];
    }

    }

    /* 如有错误,欢迎批评指正 */
  • 相关阅读:
    6410实现网卡(DM9000A)收发功能及ARP协议实现
    Shuffling Machine和双向链表
    Have Fun with Numbers及循环链表(约瑟夫问题)
    Tiny6410 LCD设置
    RAM与内存
    inet_addr解析
    map容器find用法
    WinSock编程(TCP)
    Python 时间序列作图及注释
    无法打开之前cuda的vs项目,打开之后变灰色
  • 原文地址:https://www.cnblogs.com/laydown/p/12813644.html
Copyright © 2011-2022 走看看