diff --git a/README.md b/README.md index ba7864c..c0849c3 100644 --- a/README.md +++ b/README.md @@ -348,6 +348,11 @@ LeetCode 与 LintCode 解题记录。此为个人练习仓库,代码中对重 - LeetCode 146. LRU缓存机制 - LintCode 134. LRU缓存策略 +- [寻找重复数](src/array/find-the-duplicate-number.js) + + - LeetCode 287. 寻找重复数 + - LintCode 633. 寻找重复的数 + ## 栈 - [最大矩阵](src/stack/maximal-rectangle.js) diff --git a/src/array/find-the-duplicate-number.js b/src/array/find-the-duplicate-number.js new file mode 100644 index 0000000..2aabe44 --- /dev/null +++ b/src/array/find-the-duplicate-number.js @@ -0,0 +1,24 @@ +/** + * @param {number[]} nums + * @return {number} + */ +export const findDuplicate = function (nums) { + const len = nums.length + let l = 0; let r = len - 1; let res = -1 // 数字都在1-n + while (l <= r) { + const mid = (l + r) >> 1 + let cnt = 0 + for (let i = 0; i < len; i++) { + cnt += nums[i] <= mid // true = 1,满足条件才计数 + } + + if (cnt <= mid) { + l = mid + 1 + } else { + r = mid - 1 + res = mid + } + } + + return res +} diff --git a/test/array/find-the-duplicate-number.test.js b/test/array/find-the-duplicate-number.test.js new file mode 100644 index 0000000..9e79137 --- /dev/null +++ b/test/array/find-the-duplicate-number.test.js @@ -0,0 +1,6 @@ +import { findDuplicate } from '../../src/array/find-the-duplicate-number' + +test('寻找重复数', () => { + expect(findDuplicate([1, 3, 4, 2, 2])).toBe(2) + expect(findDuplicate([3, 1, 3, 4, 2])).toBe(3) +})