LeetCode刷题记204-Divide and Conquer(分治)

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;
    }
}

面试题 17.06. 2出现的次数

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值