• "Coding Interview Guide" -- 数组的partition调整


    题目

      给定一个有序数组arr,调整arr使得这个数组的左半部分没有重复元素且升序,而不用保证右部分是否有序

      例如,arr=[1, 2, 2, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 8, 9],调整之后arr=[1, 2, 3, 4, 5, 6, 7, 8 ,9, ...]

    要求

      时间复杂度为O(N),额外空间复杂度为O(1)

     1 public void leftUniqueSort(int[] arr)
     2 {
     3     if(arr == null || arr.length < 2)
     4     {
     5       return;
     6     }
     7 
     8     int left = 0;
     9     int cur = 1;
    10         
    11     while(cur != arr.length)
    12     {
    13       if(arr[cur] != arr[left])
    14       {
    15           swap(arr, ++left, cur);
    16       }
    17       cur++;
    18     }
    19 }

    题目

      给定一个数组arr,其中只可能含有0、1、2三个值,请实现arr的排序

    要求

      时间复杂度为O(N),额外空间复杂度为O(1)

     1 public void sort(int[] arr)
     2 {
     3     if(arr == null || arr.length < 2)
     4     {
     5       return;
     6     }
     7 
     8     int left = -1;
     9     int index = 0;
    10     int right = arr.length;
    11         
    12     while(index < right)
    13     {
    14       if(arr[index] == 0)
    15       {
    16           swap(arr, ++left, index++);
    17       }
    18       else if(arr[index] == 2)
    19       {
    20           swap(arr, index, --right);
    21       }
    22       else
    23       {
    24           index++;
    25       }
    26     }
    27 }

    题目

      有一个数组arr,给定一个值k,实现比k小的数都放在数组的左边,等于k的数都放在数组的中间,大于k的数都放在数组的右边

    要求

      时间复杂度为O(N),额外空间复杂度为O(1)

     1 public void sort(int[] arr, int k)
     2 {
     3     if(arr == null || arr.length < 2)
     4     {
     5       return;
     6     }
     7 
     8     int left = -1;
     9     int index = 0;
    10     int right = arr.length;
    11         
    12     while(index < right)
    13     {
    14       if(arr[index] < k)
    15       {
    16           swap(arr, ++left, index++);
    17       }
    18       else if(arr[index] > k)
    19       {
    20           swap(arr, index, --right);
    21       }
    22       else
    23       {
    24           index++;
    25       }
    26     }
    27 }
    1 public void swap(int[] arr, int i, int j)
    2 {
    3     int temp = arr[i];
    4     arr[i] = arr[j];
    5     arr[j] = temp;
    6 }

    来源:左程云老师《程序员代码面试指南》

  • 相关阅读:
    gps示例代码
    UART 串口示例代码
    Linux soft lockup 和 hard lockup
    Linux嵌入式kgdb调试环境搭建
    Linux嵌入式GDB调试环境搭建
    Linux-workqueue讲解
    USB之hub3
    USB之设备插入波形变化2
    我运营公众号这一个月
    从12306帐号泄漏谈用户密码安全
  • 原文地址:https://www.cnblogs.com/OoycyoO/p/10943598.html
Copyright © 2020-2023  润新知