根据特征值 x 的定义,x 一定是在 [1, n] 范围内的一个整数,其中 n 是数组 nums 的长度。因此,我们可以遍历 [1, n] 并判断某个整数 i 是否为特征值。
若 i 为特征值,那么 nums 中恰好有 i 个元素大于等于 i。由于数组已经降序排序,说明 nums}[i-1] 必须大于等于 i,并且 nums}[i](如果存在)必须小于 i。
代码
[sol1-C++]
1 2 3 4 5 6 7 8 9 10 11 12 13
classSolution { public: intspecialArray(vector<int>& nums){ sort(nums.begin(), nums.end(), greater<int>()); int n = nums.size(); for (int i = 1; i <= n; ++i) { if (nums[i - 1] >= i && (i == n || nums[i] < i)) { return i; } } return-1; } };
[sol1-Java]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution { publicintspecialArray(int[] nums) { Arrays.sort(nums); intn= nums.length; for (inti=0, j = n - 1; i < j; i++, j--) { inttemp= nums[i]; nums[i] = nums[j]; nums[j] = temp; } for (inti=1; i <= n; ++i) { if (nums[i - 1] >= i && (i == n || nums[i] < i)) { return i; } } return -1; } }
[sol1-C#]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
publicclassSolution { publicintSpecialArray(int[] nums) { Array.Sort(nums); int n = nums.Length; for (int i = 0, j = n - 1; i < j; i++, j--) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } for (int i = 1; i <= n; ++i) { if (nums[i - 1] >= i && (i == n || nums[i] < i)) { return i; } } return-1; } }
[sol1-Python3]
1 2 3 4 5 6 7 8
classSolution: defspecialArray(self, nums: List[int]) -> int: nums.sort(reverse=True) n = len(nums) for i inrange(1, n + 1): if nums[i - 1] >= i and (i == n or nums[i] < i): return i return -1
intspecialArray(int* nums, int numsSize) { qsort(nums, numsSize, sizeof(int), cmp); for (int i = 1; i <= numsSize; ++i) { if (nums[i - 1] >= i && (i == numsSize || nums[i] < i)) { return i; } } return-1; }
[sol1-Golang]
1 2 3 4 5 6 7 8 9
funcspecialArray(nums []int)int { sort.Sort(sort.Reverse(sort.IntSlice(nums))) for i, n := 1, len(nums); i <= n; i++ { if nums[i-1] >= i && (i == n || nums[i] < i) { return i } } return-1 }
[sol1-JavaScript]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
var specialArray = function(nums) { nums.sort((a, b) => a - b); const n = nums.length; for (let i = 0, j = n - 1; i < j; i++, j--) { const temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } for (let i = 1; i <= n; ++i) { if (nums[i - 1] >= i && (i === n || nums[i] < i)) { return i; } } return -1; };