跟41题类似
    https://leetcode-cn.com/problems/missing-number/submissions/

    image.png

    image.png

    R表示的是最好预期,我现在还没看过所有的数,最好的情况是啥样的,
    ——> 0~N-1我每个数字都收集到了1个,没有重复值
    那么我缺失的数字就是R,也就是N

    image.png
    L要么不动,
    只要L往右动了,那么L左侧都是i位置上面放的数是i

    如果此时L位置来了个纯无用的数,比如负数,那么让L的数与R左边一个数交换,然后R来到N-1位置
    image.png
    image.png
    所以此时包括R在内往右就都是垃圾区,R变成N-1说明我的最好预期在变差,
    现在把最好预期调整为0~N-2我每个数字都收集到了1个,没有重复值,
    那么我缺失的数字就是R, 也就是N-1

    现在再来看L位置是无用的数有哪些情况?

    • image.png
    • 解释下第三种情况,
      • L来到4位置,发现值是17,既不小于L也不大于等于R, 那么就把它发货到它该去的位置,也就是17位置,但发现17位置已经躺了个17了,那么就相当于我收集到了2个17,我的最好预期在变差
    1. public int missingNumber(int[] arr) {
    2. //L左边都做到了i位置放的值是i
    3. int L = 0;
    4. int R = arr.length;
    5. while (L < R) {
    6. if (arr[L] == L) {
    7. L++;
    8. } else if (arr[L] < L || arr[L] >= R || arr[L] == arr[arr[L]]) {
    9. swap(arr, L, --R);
    10. } else {
    11. swap(arr, L, arr[L]);
    12. }
    13. }
    14. return L;
    15. }
    16. private void swap(int[] arr, int i, int j) {
    17. int tmp = arr[i];
    18. arr[i] = arr[j];
    19. arr[j] = tmp;
    20. }