【LeetCode(Java) - 1060】有序数组中的缺失元素
【LeetCode(Java) - 1060】有序数组中的缺失元素
文章目录
1、题目描述
2、解题思路
3、解题代码
1、题目描述
2、解题思路
??已知数组 A 是有序的,且每一个数字都是独一无二的,那么,如果 A[] 没有任何缺失,两个相邻元素差的绝对值应该为 1。
??比如:A[] = {5,6,7,8} 在中间就不缺任何数字,要缺也是从最后一个元素开始算起。
??如果我们要计算,截止到某个数字为止,总共缺了多少个数字,应该这样计算:
??第 0 个元素到第 n 个元素应该加了 n 次 1,第 n 位数字应该是第 0 位数字加上 n;
??比如:假设现在有数组 A[] = {4,7,9,10},要计算截至到第 3 位总共缺失是数字,可以这样计算:
??(A[3] - A[0]) - (3-0) = 10 - 4 - 3 = 4
??A[3] - A[0] 表示第 3 位从第 0 位开始,实际加了多少次 1;
??3-0 表示第 3 位从第 0 位开始,如果不缺,应该加了多少次 1;
??两者的差值,就是丢失的数字的个数。
??公式合并简写为:missing(idx) = A[idx] - A[0] - idx。表示截至到第 idx 位为止,总共缺了多少个数字。
??1、定义一个 idx = 0;
??2、判断 missing(idx) 和 K 的大小;
??3、如果 missing(idx) < K,idx++,回到第 2 步;
??4、当出现 missing(idx) >= K,说明截至到第 idx 为止,缺失的数字大于等于 K,那么缺失的数字就在 idx-1 到 idx 之间;
??5、K - missing(idx-1) + A[idx-1] 即为答案。
3、解题代码
class Solution {
public int missingElement(int[] nums, int k) {
int length = nums.length;
if (k > missing(length - 1, nums))
return nums[length - 1] + k - missing(length - 1, nums);
int left = 0, right = length - 1, mid;
while (left < right) {
mid = left + (right - left) / 2;
if (missing(mid, nums) < k) {
left = mid + 1;
} else {
right = mid;
}
}
return nums[left - 1] + k - missing(left - 1, nums);
}
/**
* 到 A[idx] 为止总共缺失的数字个数
*
* @param idx 2
* @param nums [4,7,9,10]
* @return
*/
private int missing(int idx, int[] nums) {
return nums[idx] - nums[0] - idx; // 应该有的数量 - 实际有的数量 = 缺失的数量
}
}
【LeetCode(Java) - 1060】有序数组中的缺失元素相关教程