计算缺失的元素 java_【LeetCode(Java) - 1060】有序数组中的缺失元素

【LeetCode(Java) - 1060】有序数组中的缺失元素

【LeetCode(Java) - 1060】有序数组中的缺失元素

文章目录

1、题目描述

2、解题思路

3、解题代码

1、题目描述

1a0a56954b49deea78261a8dfe722775.png

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】有序数组中的缺失元素相关教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值