孩子们的游戏&&旋转数组的最小数字&&数字在升序数组中出现的次数

134 阅读1分钟

NC139 孩子们的游戏

题目链接

1、解题思路

基本的公式吧,多写几遍就好了。

2、代码
public class Solution {
    public int LastRemaining_Solution(int n, int m) {
        int p = 0;
        for (int i = 2; i <= n; i++) {
            p = (p + m) % i;
        }
        return p;
    }    
}

NC71 旋转数组的最小数字

题目链接

1、解题思路
# 1、大致框架是二分,找到比数组最右边数的最小值,这种形式的二分还不会记住,尴尬
2、代码
import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        int l = 0;
        int r = array.length - 1;
        while (l < r) {
            if (array[l] < array[r]) {
                return array[l];
            }
            int mid = l + (r - l) / 2;
            if (array[mid] > array[r]) {
                l = mid + 1; // 找大了 右移
            } else if (array[mid] < array[r]) {
                r = mid;  // 找小了 左移
            } else {
                r--;  // 相等 r--
            }
        }
        return array[l];
    }
}

NC74 数字在升序数组中出现的次数

题目链接

1、解题思路

两次二分解决。

2、代码
public class Solution {
    private int findL(int[] array, int k) {
        int ret = -1;
        int l = 0;
        int r = array.length - 1;
        while (l <= r) {
            int mid = l + (r - l) / 2;
            if (array[mid] == k) {
                ret = mid;
                r = mid - 1;
            } else if (array[mid] < k) {
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
        return ret;
    }

    private int findR(int[] array, int k) {
        int ret = -1;
        int l = 0;
        int r = array.length - 1;
        while (l <= r) {
            int mid = l + (r - l) / 2;
            if (array[mid] == k) {
                ret = mid;
                l = mid + 1;
            } else if (array[mid] < k) {
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
        return ret;
    }

    public int GetNumberOfK(int[] array, int k) {
        int l = findL(array, k);
        if (l == -1) {
            return 0;
        }
        int r = findR(array, k);
        return r - l + 1;
    }
}