645. Set Mismatch
The set S
originally contains numbers from 1 to n
. But unfortunately, due to the data error, one of the numbers in the set got duplicated to another number in the set, which results in repetition of one number and loss of another number.
Given an array nums
representing the data status of this set after the error. Your task is to firstly find the number occurs twice and then find the number that is missing. Return them in the form of an array.
Example 1:
Input: nums = [1,2,2,4] Output: [2,3]
Note:
- The given array size will in the range [2, 10000].
- The given array‘s numbers won‘t have any order.
解题思路:
1. 将出现过的数字所对应数组中位置上的数字改写为负数,如果第二次访问到一个负数,说明当前位置对应的数字出现重复。
2. 顺序遍历数组,如果某个位置上的数不为负数,说明这个数字不存在。
刷题记录:
1. 一刷,使用比较复杂的方法做的,而且出现BUG
class Solution { public: vector<int> findErrorNums(vector<int>& nums) { vector<int> ret(2, 0); for (int num : nums) { if (nums[abs(num) - 1] < 0) { ret[0] = abs(num); } else { nums[abs(num) - 1] = -nums[abs(num) - 1]; } } for (int i = 0; i < nums.size(); i++) { if (nums[i] > 0) { ret[1] = i + 1; break; } } return ret; } };
646. Maximum Length of Pair Chain
You are given n
pairs of numbers. In every pair, the first number is always smaller than the second number.
Now, we define a pair (c, d)
can follow another pair (a, b)
if and only if b < c
. Chain of pairs can be formed in this fashion.
Given a set of pairs, find the length longest chain which can be formed. You needn‘t use up all the given pairs. You can select pairs in any order.
Example 1:
Input: [[1,2], [2,3], [3,4]] Output: 2 Explanation: The longest chain is [1,2] -> [3,4]
Note:
- The number of given pairs will be in the range [1, 1000].
解题思路:
1. 思路与最长递增子序列的方式近似,不同的是在连接pair链时,需要存储的尾部数字为后部分数字,需要比较的数字为前一个数字。使用二分查找比较,最后根据high的值决定拓展长度还是更改下一链的长度。
刷题记录:
1. 一刷,BUG FREE
class Solution { public: int findLongestChain(vector<vector<int>>& pairs) { sort(pairs.begin(), pairs.end(), less<vector<int>>()); vector<int> minTail; for (int i = 0; i < pairs.size(); i++) { int target = pairs[i][0]; int low = 0, high = static_cast<int>(minTail.size()) - 1; while (low <= high) { int mid = low + (high - low) / 2; if (target > minTail[mid]) { low = mid + 1; } else { high = mid - 1; } } if (high + 1 < minTail.size()) { minTail[high + 1] = min(minTail[high + 1], pairs[i][1]); } else { minTail.push_back(pairs[i][1]); } } return minTail.size(); } };