今天做的题都是在一个不按顺序排列的自然数数组里搜寻出现了2次,没出现的数字等,而且还有复杂度要求
如果是数组有顺序,直接二分就可以了
但是没有顺序的数组,如果先排序,再二分,复杂度就很高了,因为排序就很费劲
所以今天知道的一个惊为天人的方法就是【把数组中的自然数当作下标来看】,但是要注意的是【覆盖原数组会带来何种影响】
比如找数组中没出现过的自然数,就可以遍历数组把数组中的【数字1】当作【下标】,在数组中找到该下标对应的【数字2】,对其进行某种操作,今晚看到的操作是*-1,这种方法也容易返回,毕竟遍历总会遍历到【数字2】的,到时候abs就回去了,可以继续把【数字2】当作下标;遍历完之后,如果数组中还有正数,就说明,这个数字没有*-1,为什么没有*-1呢,是因为它的下标数字并不存在于数组中,所以返回该正数的下标,就是数组中没有出现的数字;
做完这个题后继续下一题,让我找出现了两次的数字,想当然的我觉得,出现两次的数,那就是*-1又*-1,那就是正数了,开开心心去找正数,结果返回的值是【出现了2次+没出现】的数;原来,出现两次还得有个要求,就是,这个正数应该是*-1依然大于0的数字的下标,说明之前就是负数了;
然后继续下一题,找的是没出现过的最小正整数,我又开始快乐的*-1,结果这里并不是这样做的,而是交换数字,因为要遍历所有数字,如果提前覆盖掉了,后面的数字就用不上了