[程序员代码面试指南]数组和矩阵-数组的partition调整

题目

补充问题:数组只含0,1,2,对数组排序,要求时间复杂度O(n),额外空间复杂度O(1)

题解

  • 维护三个变量,l,idx,r。左区间[0,l],中间区间[l+1,idx],右区间[idx+1,r]。
  • 初始化l=-1,r=len,idx=0。idx用来遍历数组。
    • 当arr[idx]=1,idx++;
    • 当arr[idx]=0,swap(arr[l+1,idx]),i++,idx++
    • 当arr[idx]=2,swap(arr[idx,r-1]),r--,idx++
  • 当idx=r说明中区间和右区间连上了。排序结束。

todo

原问题待做。

代码

package ArrayAndMatrix;

public class Main {
    public static void main(String args[]) {
        int[] arr= {0,1,2,0,1,2};
        sort(arr);
        for(int elm:arr) {
            System.out.println(elm);
        }
    }

    public static void sort(int[] arr) {
        if(arr.length>1) {
            int l=-1;
            int r=arr.length;
            int idx=0;
            while(idx!=r) {
                if(arr[idx]==1) {
                    ++idx;
                }
                else if(arr[idx]==0) {
                    swap(arr,idx++,++l);
                }
                else {
                    swap(arr,idx,--r);
                }
            }
        }
    }

    public static void swap(int[] arr,int idx1,int idx2) {
        int temp=arr[idx1];
        arr[idx1]=arr[idx2];
        arr[idx2]=temp;
    }
}

原文地址:https://www.cnblogs.com/coding-gaga/p/10915416.html

时间: 2024-11-10 07:42:22

[程序员代码面试指南]数组和矩阵-数组的partition调整的相关文章

《程序员代码面试指南》第八章 数组和矩阵问题 将正方形矩阵顺时针转动90

题目 将正方形矩阵顺时针转动90 java代码 package com.lizhouwei.chapter8; /** * @Description: 将正方形矩阵顺时针转动90 * @Author: lizhouwei * @CreateDate: 2018/4/28 22:16 * @Modify by: * @ModifyDate: */ public class Chapter8_2 { public void rotate(int[][] matrix) { int tR = 0; i

《程序员代码面试指南》第八章 数组和矩阵问题 "之"字形打印矩阵

题目 "之"字形打印矩阵 java代码 package com.lizhouwei.chapter8; /** * @Description: "之"字形打印矩阵 * @Author: lizhouwei * @CreateDate: 2018/4/28 22:53 * @Modify by: * @ModifyDate: */ public class Chapter8_3 { public void printMatrixZigZag(int[][] matri

《程序员代码面试指南》第八章 数组和矩阵问题 自然数数组的排序

题目 自然数数组的排序 java代码 package com.lizhouwei.chapter8; /** * @Description: 自然数数组的排序 * @Author: lizhouwei * @CreateDate: 2018/5/8 20:51 * @Modify by: * @ModifyDate: */ public class Chapter8_14 { public void sort(int[] arr) { int left = 0; int right = arr.

《程序员代码面试指南》第八章 数组和矩阵问题 不包含本位置值的累乘数组

题目 不包含本位置值的累乘数组 java代码 package com.lizhouwei.chapter8; /** * @Description: 不包含本位置值的累乘数组 * @Author: lizhouwei * @CreateDate: 2018/5/9 21:11 * @Modify by: * @ModifyDate: */ public class Chapter8_22 { public int[] product(int[] arr) { int[] res = new in

《程序员代码面试指南》第八章 数组和矩阵问题 需要排序的最短子数组长度

题目 需要排序的最短子数组长度 java代码 package com.lizhouwei.chapter8; /** * @Description: 需要排序的最短子数组长度 * @Author: lizhouwei * @CreateDate: 2018/4/29 8:03 * @Modify by: * @ModifyDate: */ public class Chapter8_5 { public int getMinLength(int[] arr) { if (arr == null

程序员代码面试指南 IT名企算法与数据结构题目最优解 ,左程云著pdf高清版免费下载

下载地址:网盘下载 备用地址:网盘下载 内容简介  · · · · · ·这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮助广大程序员的面试准备做到万无一失.“刷”完本书后,你就是“题王”!__eol__本书采用题目+解答的方式组织内容,并把面试题类型相近或者解法相近的题目尽量放在一起,读者在学习本书时很容易看出面试题解法之间的联系,使知识的学习避免碎片化

[程序员代码面试指南]数组和矩阵问题-找到无序数组中最小的k个数(堆排序)

题目链接 https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=13&tqId=11182&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 从无序序列,找到最小topk个元素. 解题思路 使用大根堆维护最小topk个元素: - 首先前k个元素建立大根堆(从

[程序员代码面试指南]数组和矩阵问题-未排序正数数组中累加和为给定值的最长子数组长度

题目描述 给定无序数组,每个值均为正数,再给定整数k.求arr中所有子数组中所有元素相加和为k的最长子数组长度.无则输出-1. 例: 输入 arr=[1,2,1,1,1],k=3 输出 3 解题思路 (时间复杂度O(N),空间复杂度O(1)) 维护指针l,r表示子数组区间.初始l=r=0,向右移动至r=arr.length结束. 维护当前子数组和sum,及到当前为止满足题意的最大len.初始sum=arr[0],len=-1. 每次比较sum和k,根据情况选择移动l还是r,并更新sum和len.

[程序员代码面试指南]数组和矩阵问题-数组中子数组的最大累乘积

问题描述 给定数组,输出所有子数组的累积的最大值. 题解 以arr[i]结尾的最大累乘积=max{maxarr[i],minarr[i],arr[i]},其中max.mini表示以arr[i-1]结尾的最大累乘积.最小累乘积. 最后再取一个最大值即可. 时间复杂度O(n) 代码 public class Main { public static void main(String args[]) { int[] arr= {-2,4,0,3,5,8,-1}; int maxProduct=getM