方案一:
Java代码:
class Solution { public int duplicateInArray(int[] nums) { // 如果输入数组是空, 直接返回-1 if (nums.length == 0) return -1; // 创建aa数组, 长度是 n int aa[] = new int[nums.length]; for (int i = 0; i<nums.length; i++){ if (nums[i] < 0 || nums[i] > (nums.length-1)) return -1; aa[nums[i]] ++; } for (int i=0; i<nums.length; i++){ if (aa[i] > 1) return i; } return -1; } }
解题思路:
因为输入的是数组, 并且数组中元素在 0-n-1之间,
因此直接设 一个新的数组 aa, 长度为n, 这样nums数组中的元素大小对应于 aa数组的索引,
当 nums 中出现该元素, 对应aa数组的索引位置+1,
最后遍历 aa 数组, 当值大于2时, 说明该索引在 nums 数组中出现的次数多于1次, 返回 索引值
需要注意:
输入数组是空, 直接返回 -1
nums中的数组元素 不满足 [0, n-1] 的条件, 直接返回-1
方案二:
Java代码
class Solution { public int duplicateInArray(int[] nums) { // 方法2: int n = nums.length; if (n==0) return -1; // 进行数组扫描 for (int i=0; i<n; i++){ // 如果 nums 数组中的元素不满足条件, 则返回-1 if (nums[i] < 0 || nums[i] > (n-1)) return -1; } for (int i=0; i<n; i++){ // 将nums数组中的每一个元素放入对应的索引中 while(nums[i] != nums[nums[i]]) { // swap(nums[i], nums[nums[i]]); // 进行交换 int x = nums[i]; // 将 每一个元素放入对应的索引中 nums[i] = nums[nums[i]]; nums[x] = x; } // 循环结束的情况: // 1. nums[0]=0, 即第i个索引位置 正好是元素i, 则进入下一个for循环 i++ // 2. nums[0]=x, and nums[x] =x, 说明第x个索引位置正好是元素x, 并且因此 nums[0]=x, 说明x元素不止一个 if (nums[i] != i) return nums[i]; } return -1; } }
解题思路
将 每一个元素nums[i] 放入到 对应的索引位置
当 索引为 nums[i] 的位置的元素不等于 nums[i], 则将其两者交换