classSolution { public: intsingleNonDuplicate(vector<int>& nums){ int n = nums.size(); int l = 0, r = n - 1; while (l < r) { int m = l + (r - l) / 2; if (nums[m] == nums[m + 1]) { if (m & 1) { r = m - 1; } else { l = m + 2; } } else { if (m & 1) { l = m + 1; } else { r = m; } } } return nums[l]; } };
too smart
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution { public: intsingleNonDuplicate(vector<int>& nums){ int n = nums.size(); int l = 0, r = n - 1; while (l < r) { int m = l + (r - l) / 2; if (nums[m] == nums[m ^ 1]) { // 任一数m异或1得到其相邻的数,偶数则是相邻较大的奇数,奇数则是相邻较小的偶数 l = m + 1; // 如果相邻两数相等,则所求的数肯定在右侧,因为两个数左边是偶数个数右边是奇数个数 } else { // 如果相邻两数不等,则所求的数要不是nums[m]要不在左侧 r = m; } } return nums[l]; } };