package com.interview.number; import com.interview.sort.QuickSort; /** * Date 02/17/2016 * @author Tushar Roy * Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. * If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order). * * Time complexity is O(n) * Space complexity is O(1) * * https://leetcode.com/problems/next-permutation/ * e.g 1 7 9 8 4 will transform to 1 8 4 7 9 * or 4 2 6 4 3 will transform to 4 3 2 4 6 */ public class PermutationBiggerThanNumber { public void nextPermutation(int[] nums) { int i; for (i = nums.length - 2; i >= 0 ; i--) { if (nums[i] < nums[i + 1]) { break; } } if (i != -1) { int pos = ceiling(nums[i], i + 1, nums.length - 1, nums); int t = nums[pos]; nums[pos] = nums[i]; nums[i] = t; } reverse(nums, i + 1, nums.length - 1); } private void reverse(int nums[], int start, int end) { while (start <= end) { int t = nums[start]; nums[start] = nums[end]; nums[end] = t; start++; end--; } } private int ceiling(int val, int start, int end, int[] nums) { while (start <= end) { int middle = (start + end)/2; if (nums[middle] > val && (middle + 1 == nums.length || nums[middle+1] <= val)) { return middle; } else if (nums[middle] > val) { start = middle + 1; } else { end = middle - 1; } } throw new IllegalArgumentException(); } public static void main(String args[]){ PermutationBiggerThanNumber pb = new PermutationBiggerThanNumber(); int arr[] = {1,7,9,8,4}; pb.nextPermutation(arr); for(int i=0; i < arr.length; i++){ System.out.print(arr[i] + " "); } } }