classSolution { public: intfindDuplicate(vector<int>& nums){ int len = nums.size(); int left = 1, right = len - 1; int mid = 0; int ans = -1; while (left <= right) { int count = 0; mid = ((right - left) >> 1) + left; for (int i = 0; i < len; ++i) if (nums[i] <= mid) ++count; if (count <= mid) left = mid + 1; else { ans = mid; right = mid - 1; } } return ans; } };
classSolution { public: intfindDuplicate(vector<int>& nums){ int len = nums.size(); int ans = 0; int bitCnt = 0; int temp = len - 1; while (temp >>= 1) ++bitCnt; for (int i = 0; i <= bitCnt; ++i) { int x = 0, y = 0; for (int j = 0; j < len; ++j) { if (nums[j] & (1 << i)) ++x; if (j > 0 && (j & (1 << i))) ++y; } if (x > y) ans |= (1 << i); } return ans; } };
classSolution { public: introb(vector<int>& nums){ int len = nums.size(); if (len == 0) return0; if (len == 1) return nums[0]; vector<int> sum(len, 0); sum[0] = nums[0]; sum[1] = max(nums[0], nums[1]); for (int i = 2; i < len; ++i) { sum[i] = max(sum[i - 1], nums[i] + sum[i - 2]); } return sum.back(); } };
// 滚动数组优化空间 classSolution { public: introb(vector<int>& nums){ int len = nums.size(); if (len == 0) return0; if (len == 1) return nums[0]; int pre = nums[0], next = max(nums[1], nums[0]); int temp = 0; for (int i = 2; i < len; ++i) { temp = next; next = max(next, nums[i] + pre); pre = temp; } return next; } };
classSolution { public: intnumSquares(int n){ if (static_cast<int>(sqrt(n)) * static_cast<int>(sqrt(n)) == n) return1; if (IsFormat(n)) return4; for (int i = 1; i * i <= n; ++i) { int j = n - i * i; if (static_cast<int>(sqrt(j)) * static_cast<int>(sqrt(j)) == j) return2; } return3; } boolIsFormat(int x) { while (x % 4 == 0) x /= 4; return x % 8 == 7; } };