今天的内容是 704 和 27 ovo
704. 二分查找
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
Myself C:
//左闭右闭 [0,1,2,3]
int search(int* nums, int numsSize, int target) {
int left = 0,right = numsSize - 1;
while(left <= right) //wrong 1 : 因为是左闭右闭 故这里必须是 <=
{
int mid = (left + right) / 2;
if(target == nums[mid]) return mid;
if(target > nums[mid])
left = mid + 1;
else
right = mid - 1;
}
return -1;
}
Myself C++:
//左闭右闭 [0,1,2,3]
int search(vector<int>& nums, int target)
{
int left = 0,right = nums.size() - 1;
while(left <= right)
{
int mid = left + (right - left) / 2; //防止溢出
if(target == nums[mid]) return mid;
if(target < nums[mid]) right = mid - 1;
else left = mid + 1;
}
return -1;
}
Carl C++:
//左闭右开 [0,1,2,3)
int search(vector<int>& nums, int target)
{
//left是查找列表的第一个 right是查找列表最后一个的下一个
int left = 0 , right = nums.size();
while(left < right)
{
int mid = (left + right) / 2;
if(target == nums[mid]) return mid;
if(target > nums[mid]) left = mid + 1;
else right = mid;
}
return -1;
}
Myself Sum:
-
NOTICE 左闭右闭 左闭右开
-
C语言的int类型最大是10^9
-
C++的
vector
C语言可以用
int arr[]
定义数组 , 缺点是定长数组C++里面有动态数组
vector
,可以理解为不定长数组,在C++中叫做容器vector
定义后能将所有的值初始化为0!#include<iostream> #include<vector>//使用vector 需要引入头文件 using namespace std; int main() { vector<int> v;//定义一个 vector v 初始不定义大小 cout << v.size();//未配大小,此时为 0 v.resize(8);//将长度resize为 8 vector<int> v1(10);//定义一个vector v1 长度为 10 vector<int> v3(100,9);//将长度为100的数组中所有值初始化为9 //使用迭代器访问 vector //c.begin()是一个指针,指向容器的第一个元素 //c.end()也是一个指针,指向容器的最后一个元素的后一个位置 for(auto it = v.begin(); it != v.end(); it++) { cout << *it << " "; } return 0; }
27. 移除元素
给你一个数组 nums
和一个值 val
你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素文章来源:https://www.toymoban.com/news/detail-779433.html
Myself C++:
//呃...我的双循环没写出来..数组不是越界了就是时间超时了
//然后我就想用这个暴力覆盖...听了Carl讲解原来这个是快慢指针...
//虽然我感觉挺暴力的...但是好吧...叫快慢指针确实更有说服力一些
//思路:循环找到不是val的值去从头覆盖数组 最后resize数组
// 时间复杂度:O(n)
// 空间复杂度:O(1)
int removeElement(vector<int>& nums, int val)
{
int index = 0;
for(int i = 0; i < nums.size(); i++)
{
if(nums[i] != val) nums[index++] = nums[i];
}
nums.resize(index);
return nums.size();
}
Carl C++:
// 时间复杂度:O(n^2)
// 空间复杂度:O(1)
int removeElement(vector<int>& nums, int val)
{
int size = nums.size();
for (int i = 0; i < size; i++)
{
if (nums[i] == val)
{
for (int j = i + 1; j < size; j++)
nums[j - 1] = nums[j];
i--;
size--;
}
}
return size;
}
文章来源地址https://www.toymoban.com/news/detail-779433.html
到了这里,关于day 1 LeetCode刷题日志的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!