https://leetcode-cn.com/problems/beautiful-array/submissions/
class Solution {
public void swap(int[] a, int i, int j) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
public void bulid(int[] ans, int[] cur, int l, int r) {
if (r - l + 1 <= 1) return;
if (r - l + 1 <= 2) {
if ((cur[l] & 1) == 0 ) {
swap(ans, l, r);
swap(cur, l, r);
}
return;
}
int i = l;
int j = r;
while (i < j) {
if ((cur[i] & 1) == 0) {
while ((cur[j] & 1) == 0 && j > i) {
j --;
}
if (j > i) {
swap(ans, i, j);
swap(cur, i, j);
j --;
}
}
i ++;
}
if ((cur[l] & 1) != (cur[j] & 1)) j --;
for (i = l; i <= r; i ++) {
cur[i] /= 2;
}
bulid(ans, cur, l, j);
bulid(ans, cur, j + 1, r);
}
public int[] beautifulArray(int N) {
int[] ans = new int[N];
int[] cur = new int[N];
for (int i = 0; i < N; i ++) {
ans[i] = i + 1;
cur[i] = i + 1;
}
bulid(ans, cur, 0, N - 1);
return ans;
}
}
https://leetcode-cn.com/problems/sorted-matrix-search-lcci/
class Solution {
public int binarySearchRow(int[] row, int target, int i, int j) {
if (i > j) return -1;
int l = 0;
int r = j;
int m;
while (l < r) {
m = (l + r) >> 1;
if (row[m] == target) return m;
if (row[m] > target) {
r = m - 1;
} else {
l = m + 1;
}
}
if (r == -1) return r;
if (row[r] < target && r < j - 1) {
return r + 1;
}
return r;
}
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix.length == 0 || matrix[0].length == 0) return false;
int pre = matrix[0].length - 1;
for (int i = 0; i < matrix.length; i ++) {
int j = binarySearchRow(matrix[i], target, 0, pre);
if (j == -1) return false;
if (matrix[i][j] == target) return true;
pre = j;
if (matrix[i][j] > target) pre --;
}
return false;
}
}
https://leetcode-cn.com/problems/smallest-k-lcci/
class Solution {
public void myQuickSort(int[] arr, int i, int j, int k) {
if (i >= j) return;
if (i >= k) return;
int l = i;
int r = j;
int tmp = arr[i];
while (l < r) {
while (l < r && arr[r] >= tmp) r --;
arr[l] = arr[r];
while (l < r && arr[l] <= tmp) l ++;
arr[r] = arr[l];
}
arr[l] = tmp;
if (l == k) return;
myQuickSort(arr, i, l - 1, k);
myQuickSort(arr, l + 1, j, k);
}
public int[] smallestK(int[] arr, int k) {
int[] ans = new int[k];
myQuickSort(arr, 0, arr.length - 1, k);
System.arraycopy(arr, 0, ans, 0, k);
return ans;
}
}
class Solution {
int[] a = new int[]{0,1,20,300,4000,50000,600000,7000000,80000000,900000000};
int[] b = new int[]{1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
public int numberOf2sInRange(int n) {
if (n < 2) return 0;
for (int i = 9; i >= 0; i --) {
if (n >= b[i]) {
int k = n / b[i];
if (k > 2) {
return k * a[i] + b[i] + numberOf2sInRange(n % b[i]);
}else if (k == 2) {
return k * a[i] + n % b[i] + 1 + numberOf2sInRange(n % b[i]);
} else {
return a[i] + numberOf2sInRange(n % b[i]);
}
}
}
return 0;
}
}