leetcode 704 题目链接:
https://leetcode.com/problems/binary-search/
尝试 c++ 写题,搭建架子代码(尝试搭建ACM风格)
class Solution
{
public:
int search(vector<int> &nums, int target)
{
}
};
int main()
{
Solution sol;
vector<int> nums = {-1, 0, 3, 5, 9, 12};
sol.search({-1, 0, 3, 5, 9, 12}, 9);
// 非常量引用的初始值必须为左值
// initial value of reference to non-const must be an lvalue
}
https://blog.csdn.net/hou09tian/article/details/80565343
这边文章解释的很清楚了,非常量引用传参进去后可能会被修改,如果是个右值显然是不行的
再次运行报不可以初始化,原来vscode默认只支持c++98标准,在.vscode里的task.json添加”-std=c++11“编译参数即可
算法思路文章参考:
https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E...
最终ac代码:(左闭右开)
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int search(vector<int>& nums, int target) {
size_t start = 0;
size_t end = nums.size();
while (start < end) {
size_t middle = start + ((end - start) >> 1);
if (nums[middle] == target) {
return static_cast<int>(middle);
} else if (nums[middle] > target) {
end = middle;
} else {
start = middle + 1;
}
}
return -1;
}
};
再次尝试左闭右闭:
class Solution
{
public:
int search(vector<int> &nums, int target)
{
size_t start = 0;
size_t end = nums.size() - 1;
while (start <= end)
{
size_t middle = start + ((end - start + 1) >> 1);
if (nums[middle] == target)
{
return static_cast<int>(middle);
}
else if (nums[middle] > target)
{
end = middle - 1;
}
else
{
start = middle + 1;
}
}
return -1;
}
};
[5], -5 的用例过不去,tle了,将size_t改为int,通过。
可以看出为什么api之类的都采用左闭右开,写出来的代码更自然,计算区间什么的也更直接。
leetcode 27 题目链接:
https://leetcode.com/problems/remove-element/
ac代码:
class Solution
{
public:
int removeElement(vector<int> &nums, int val)
{
for (vector<int>::iterator it = nums.begin(); it != nums.end();)
{
if (*it == val)
{
it = nums.erase(it);// O(n) time complexity
}
else
{
it++;// prefer pre-increment for post-increment making a temporary copy
}
}
return nums.size();
}
};
快慢指针版本:
算法思路参考文章:
https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E...
class Solution
{
public:
int removeElement(vector<int> &nums, int val)
{
int slow = 0;
for (int fast = 0; fast < nums.size(); ++fast)
{
if (nums[slow] != val)
{
nums[slow] = nums[fast];
++slow;
}
}
return slow;
}
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。