链接
剑指 Offer 53 - II. 0~n-1中缺失的数字
448. 找到所有数组中消失的数字
解法
遍历
使用一个数组,该数组长度为原数组长度+1,遍历原数组,新数组中下标为原数组中元素,则将其赋值为1,否则不用管则为0,遍历新数组,返回元素为1的下标,即为原数组中丢失的数字
代码
class Solution {
public int missingNumber(int[] nums)
{
//递增,排序
int[] ret = new int[nums.length + 1];
for (int num : nums)
{
ret[num] = 1;
}
for (int i = 0; i < ret.length; i++)
{
if (ret[i] == 0)
{
return i;
}
}
return -1;
}
}
二分
设置左右两数字分别为nums的0和尾元素,然后二分查找,如果中间元素等于两数之和的一半,则左数 +1,反之则右数减一,直到左数大于右数,退出循环,左数即为缺失的数字
代码
class Solution {
public int missingNumber(int[] nums)
{
int left = 0, right = nums[nums.length - 1];
while (left <= right)
{
int mid = (left + right) / 2;
if (nums[mid] == mid)
{
left = mid + 1;
} else
{
right = mid - 1;
}
}
return left;
}
}
双指针
class Solution {
public int missingNumber(int[] nums)
{
//9
int len = nums.length;
int j = nums[len - 1]; //9
for (int i = 0; i <= j; i++, j--)
{
//从前寻找
if (i != nums[i])
{
return i;
}
// 8 == 9 ? : 9
int val = len - 1 == nums[len - 1] ? nums[j] : nums[j - 1];
if (val != j)
{
return j;
}
}
return nums.length;
}
}
代码(448. 找到所有数组中消失的数字)
思路
数组保存出现过的数,在将没出现过的数入 list
class Solution {
public List<Integer> findDisappearedNumbers(int[] nums)
{
//nums 为 1 --> n
int[] ret = new int[nums.length + 1];
for (int num : nums)
{
ret[num]++;
}
List<Integer> list = new ArrayList<>();
for (int i = 1; i < ret.length; i++)
{
if (0 == ret[i])
{
list.add(i);
}
}
return list;
}
}
将所有正数作为数组下标,对应数组值为负值,仍为正数的位置即为小时的数字
class Solution {
public List<Integer> findDisappearedNumbers(int[] nums)
{
//将所有正数作为数组下标,对应数组值为负值
//仍为正数的位置即为小时的数字
for (int i = 0; i < nums.length; i++)
{
nums[Math.abs(nums[i]) - 1] = -Math.abs(nums[Math.abs(nums[i]) - 1]);
}
List<Integer> ret = new ArrayList<>();
for (int i = 0; i < nums.length; i++)
{
if (nums[i] > 0)
{
ret.add(i + 1);
}
}
return ret;
}
}