题目 给定一个数组arr,和一个数num,请把小于等于num的数放在数 组的左边,大于num的数放在数组的右边。 要求额外空间复杂度O(1),时间复杂度O(N)
思路 设置一个指针指向当前数组中小于num的最后一个数字的位置,遍历,若当前数字大于num,则不做任何操作继续遍历;若当前数字小于num,则将该位置数字与指针所指数字的后一位数字(即大于num的第一个数字)做交换。
package section1;
import java.util.Arrays;
public class Num {
public static void num(int[] arr, int num){
if (arr == null || arr.length < 2) return;
int flag = -1;
for (int i = 1; i < arr.length; i++){
if (arr[i] > num) continue;
change(arr, flag+1, i);
flag++;
}
}
public static void change(int[] arr, int flag, int i){
int f = arr[flag];
arr[flag] = arr[i];
arr[i] = f;
}
public static void main(String[] args){
int[] arr = {6, 4, 1, 6, 7, 9, 23, 41, 7, 64};
int n = 3;
num(arr, n);
System.out.println(Arrays.toString(arr));
}
}