645. Set Mismatch

The set S originally contains numbers from 1 to n. But unfortunately, due to the data error, one of the numbers in the set got duplicated to another number in the set, which results in repetition of one number and loss of another number.

Given an array nums representing the data status of this set after the error. Your task is to firstly find the number occurs twice and then find the number that is missing. Return them in the form of an array.

出现了数值和索引一致,并且各异这种极好的条件,所以可以考虑索引排序。
问题是怎么写索引排序。在所有数都不同的情况下,考虑到每个数值都会对应唯一一个索引,如果在原来数组的位置I-1上对应的NUMS[I]!=i-1,那么明显的nums[i]应该被放到nums[i]-1上去,此时数组[nums[i]-1]位置上肯定也有一对这样的不匹配(因为nums[i]应该被放在nums[i]-1的位置上,由各异可以知道这个位置上只能有一个,明显的现在nums[i]-1位置上的数不是nums[i])。换句话说,对于没有重复值只存在1.两个位置上的数都不符合条件。2.两个位置上的数都符合条件,这两种情况。

现在,出现了重复元素,出现了第三种情况,即一个符合,一个不符合。这种情况,只有在这个元素是重复元素时才会出现。所以我们直接跳过元素就好了

注意在swap时一定要保证交换以后一定是num[i]=i+1,数组满足排定,所以用的whlle循环。

class Solution {
    public int[] findErrorNums(int[] nums) {
        int[] result= new int[2];
        for(int i = 0 ;i<nums.length;i++)
        {
            while(nums[i]!=i+1&&nums[nums[i]-1]!=nums[i])
                swap(nums,i,nums[i]-1);
           
        }
// 排定数组
 for(int i = 0 ;i<nums.length;i++)
{
     if(nums[i]!=i+1)
      {
           result[0]=nums[i];
          result[1]=nums[i+1];
}
        return result;
    }
    private void swap (int[] nums,int i ,int j )
    {
        int temp =nums[i];
        nums[i]=nums[j];
        nums[j]=temp;
    }
}

排序后遍历找到第一个不满足条件的数。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,767评论 0 33
  • PLEASE READ THE FOLLOWING APPLE DEVELOPER PROGRAM LICENSE...
    念念不忘的阅读 13,526评论 5 6
  • 平视 有时,在头脑里旋转出的,是苍蝇的经验。心灵中这些莫名的焦灼如同扶不起的阿斗,拒绝向上,即使边走边歇也不干。 ...
    稻子X视角阅读 311评论 0 0
  • Storm在1.0之后对nimbus支持了HA,根据官方提供的文档,同样是利用了zk来做分布式锁,并且配置文件中新...
    aiguang2016阅读 4,380评论 0 4
  • 山里人,常年累月居住山中,平静的生活方式,平静的心,面对现实生活中的尔虞我诈知之甚少,但是为了生活仍然需要奔波在鬼...
    飞的更好阅读 322评论 0 0