题目描述
给你一个数组,数组长度是N,那么,数组中的数都是1~N之间的数,现在请你求出,在该数组中1-N之间到底少了几个数?要求空间复杂度1,时间复杂度n
比如:1 2 3 3 5
长度为5,1到5之间少了一个数4
思路分析
利用数组的索引来思考,题目既然给了不可能超过数组长度,那就用索引0对应数字1,索引1对应数字2,依次对应。
题目要求空间复杂度是1,因此,就不能使用额外空间了,只能在原数组上调整了,从头遍历数组,把每一个数放到其数值-1的索引上,把原来位置的数拿出来,继续放置到其应该在的位置上,如果已经在正确的位置,则啥也不做。依次遍历完数组。
最后,遍历一遍数组,数组下标加1不等于数值的位置,就是缺失的数,统计后返回。
代码
public static int f1(int[] arr){
for (int i = 0; i < arr.length; i++) {
swap(arr,arr[i]);
}
int sum=0;
for (int i = 0; i < arr.length; i++) {
if(arr[i]!=i+1){
sum++;
}
}
return sum;
}
public static void swap(int[] arr,int num){
while (arr[num-1]!=num){
int temp=arr[num-1];
arr[num-1]=num;
num=temp;
}
}