zoukankan      html  css  js  c++  java
  • "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 }

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

  • 相关阅读:
    运营设计方法论
    使用 typescript ,提升 vue 项目的开发体验(2)
    PAT 1078. 字符串压缩与解压
    PAT 1077. 互评成绩计算
    PAT 1076. Wifi密码
    PAT 1075. 链表元素分类
    PAT 1074. 宇宙无敌加法器
    PAT 1073. 多选题常见计分法
    PAT 1072. 开学寄语
    PAT 1071. 小赌怡情
  • 原文地址:https://www.cnblogs.com/OoycyoO/p/10943598.html
Copyright © 2011-2022 走看看