645. 错误的集合
集合 s
包含从 1
到 n
的整数。找到重复数字和丢失数字
方法一:先排序,用一个数记录前一个元素,初始为0,一个数记录当前元素。如果两数相等则为重复,如果两数相差大于1,则可锁定丢失值。
方法二:定义一个大小相同的新数组,遍历原数组,根据当前值找到新数组数组下标为当前值的位置。如果为0,改为1,如果为1,说明为重复数字。最后遍历新数组,找到为0的数组下标,则为丢失数字。
方法二改进:直接在原数组上操作,根据当前值的绝对值定位数组下标,将其改为负数,如果改之前已经是负数,则该下标为重复数。最后遍历数组,为正数的下标为丢失数字。
697. 数组的度
方法:使用哈希表的方式。Map<Integer, int[]>,键为元素,数组的第一个元素为出现次数,第二个元素为起始地址,第三个元素为终止地址。然后遍历哈希表,不断更新最大出现次数和最短连续子数组。
448. 找到所有数组中消失的数字
方法一:鸽笼原理,如果出现过,相应的“鸽笼”就会被占掉。将当前值对应的数组下标值加上数组长度或者改为负数。最后通过遍历原数组,将值小于等于数组长度或者为负数的下标输出。
方法二:交换。遍历数组,将当前位置的值与数组下标为该值的值进行互换,直到当前位置索引值加一与值相等。最后所有值都应该回到自己的位置,遍历数组,输出值与下标不匹配的下标值。