1217. 玩筹码(125)
代码实现(首刷自解)
class Solution {
public:
int minCostToMoveChips(vector<int>& position) {
int odd = 0;
int even = 0;
for (int pos : position) {
if (pos & 1 == 1) odd++;
else even++;
}
return min(even, odd);
}
};
209. 长度最小的子数组(126)
代码实现(看题解)
自己写的二分函数,然后超时……
class Solution {
public:
int binarySearch(const vector<int> sums, int l, int r, int target) {
if (sums[r] < target) return -1;
int m;
while (l < r) {
m = (l + r) / 2;
if (sums[m] >= target) r = m;
else l = m + 1;
}
return l;
}
int minSubArrayLen(int target, vector<int>& nums) {
int n = nums.size();
vector<int> sums(n + 1, 0);
for (int i = 1; i <= n; i++) {
sums[i] = sums[i - 1] + nums[i - 1];
}
int minLength = INT_MAX;
int i;
for (int j = 1; j <= n; j++) {
i = binarySearch(sums, j, n, target + sums[j - 1]);
if (i == -1) continue;
minLength = min(minLength, i - j + 1);
}
return minLength == INT_MAX ? 0 : minLength;
}
};
用STL版本:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int n = nums.size();
vector<int> sums(n + 1, 0);
for (int i = 1; i <= n; i++) {
sums[i] = sums[i - 1] + nums[i - 1];
}
int minLength = INT_MAX;
for (int j = 1; j <= n; j++) {
auto i = lower_bound
(sums.begin(), sums.end(), target + sums[j - 1]);
if (i != sums.end()) {
minLength = min
(minLength, static_cast<int>((i - sums.begin())
- j + 1));
}
}
return minLength == INT_MAX ? 0 : minLength;
}
};
611. 有效三角形的个数(127)
代码实现(首刷自解)
class Solution {
public:
int triangleNumber(vector<int>& nums) {
int n = nums.size();
sort(nums.begin(), nums.end());
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
int left = j + 1, right = n - 1;
int k = j;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] < nums[i] + nums[j]) {
k = mid;
left = mid + 1;
}
else {
right = mid - 1;
}
}
ans += k - j;
}
}
return ans;
}
};
总结
从动态规划到二分查找,明显感觉离开了舒适区,很不适应,接下来需要继续努力!