没啥好的笔记,就水一篇吧,还是记录一下今天写的题目咯
题目:
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
思路与分析:最好的消息是数组是递增的,也就省略排序啦,就可以很容易的看出时间复杂度了;数组长度与数组元素差1,而且递增,那么就可以想到索引与元素值得关系咯,将数组元素一遍历就能能找到除数组长度值的以外缺失元素的例子,那么遍历元素都无返回就可以直接返回数组长度即最大值啦
举个例子:
[0, 2] ==> 遍历数组元素时,发现索引为1时,数组元素值为2,不同,那么该数组就缺失了元素1,返回即可;
[0, 1] ==> 遍历数组元素都没有查出,即索引都能找到对应元素,此时就可以返回元素2,即数组长度啦;
class Solution {
public int missingNumber(int[] nums) {
int len = nums.length;
for (int i = 0; i < len; i++){
if (i != nums[i]){
return i;
}
}
return len;
}
}
思路与分析:
根据数学函数,可以求出0~n-1的和,关系式为:sum = n * (n - 1) / 2 也就是数据求和;
按照数组长度求和的结果值与数组元素和的值的差就是缺失元素啦;
举个栗子:
[0, 1, 2, 4, 5] 长度求和:5 * 4 / 2 = 10 哎,是不是发现不对劲啦,对咯,求和函数式是0~n,而我们的数据只需要从0~n-1,那么此时的n就不是数组的长度咯,需要+1,即此时6 * 5 / 2 = 15;数组元素求和为0 + 1 + 2 + 4 + 5 = 12;差为3就是缺失的元素咯。
class Solution {
public int missingNumber(int[] nums) {
int len = nums.length;
// 这里可以长度先加1,再使用求和式,也可以像我这样,后面再加1,效果一致哦
int sum = len * (len + 1) / 2;
int arrSum = 0;
for (int i : nums){
arrSum += i;
}
return sum -arrSum;
}
}
思路与分析:
还可以通过哈希表,这个其实一般,在这里效果只能说不如上面两种,但是也可以解决,利用了Set集合的特性,值不重复。可以将数组元素先添加集合中,再遍历与数组等长的索引值循环,再通过contains(object o)进行判断,如果索引值已经在集合中,返回true,此元素不缺失,当返回false时,集合中不存在该元素意味着缺失了。
class Solution {
public int missingNumber(int[] nums) {
Set<Integer> set = new HashSet<>();
int len = nums.length;
for (int i = 0; i < len; i++){
set.add(nums[i]);
}
for (int i = 0; i <= len; i++){
if (!set.contains(i)){
return i;
}
}
// 这个返回值随您喜欢啦,上面代码不错的话,不需要到这里来的,但是又要return,所以随意啦
return -1;
}
}
水水水~~