package com.interview.leetcode.arrays; import com.interview.utils.ArrayUtil; /** * Created_By: stefanie * Date: 14-11-17 * Time: 下午7:52 */ public class ArrayOperation { public static void rotateKStep(int[] array, int k){ if(array.length <= 1) return; k = k % array.length; reverse(array, 0, k - 1); reverse(array, k, array.length - 1); reverse(array, 0, array.length - 1); } public static void reverse(int[] array, int begin, int end){ for(int i = 0; i < (end - begin + 1)/ 2; i++){ int temp = array[begin + i]; array[begin + i] = array[end - i]; array[end - i] = temp; } } public static void reverseByLength(int[] array, int begin, int length){ int end = begin + length - 1; for(int i = 0; i < length / 2; i++){ int temp = array[begin + i]; array[begin + i] = array[end - i]; array[end - i] = temp; } } public static int partitionArray(int[] nums, int k) { //write your code here int i = -1; for(int j = 0; j < nums.length; j++){ if(nums[j] < k) ArrayUtil.swap(nums, ++i, j); } return i + 1; } // use k scan array, and keep 2 more pointers i and j // element in [0,i] < key // element in (i,j] == key // element in (j,k] > key public static void partition3Way(int[] A, int key){ int i = -1; int j = -1; for(int k = 0; k < A.length; k++){ if(A[k] > key) continue; else if(A[k] == key) ArrayUtil.swap(A, k, ++j); else { if(j == i) j = i + 1; //no elements equals to key ArrayUtil.swap(A, k, ++i); if(A[k] == key) ArrayUtil.swap(A, k, ++j); //swap back if prev swap put equal element to k } } } }