剑指 Offer 03. 数组中重复的数字
这道题在原书上绝对不是简单级别啊!
它考察的是程序员的沟通能力,先问面试官要时间/空间需求!!!
只是时间优先就用字典,
还有空间要求,就用指针+原地排序数组,
如果面试官要求空间O(1)并且不能修改原数组,还得写成二分法!!!
这个最明显的做法当然就是用一个HashSet,排除重复就行
原地排序这种想法到是很好。。。
如果没有重复数字,那么正常排序后,数字i应该在下标为i的位置,所以思路是重头扫描数组,遇到下标为i的数字如果不是i的话,(假设为m),那么我们就拿与下标m的数字交换。在交换过程中,如果有重复的数字发生,那么终止返回ture
这样是O1空间复杂度的,只是修改了原数组
class Solution { public int findRepeatNumber(int[] nums) { int temp; for(int i=0;i<nums.length;i++){ while (nums[i]!=i){ if(nums[i]==nums[nums[i]]){ return nums[i]; } temp=nums[i]; nums[i]=nums[temp]; nums[temp]=temp; } } return -1; } }