1.题目:
2.知识点:
数组: a.连续的储存结构,地址必须是连续的。
b.下表从0开始。
3.思路:
a.暴力:直接比对
class Solution {
public:
int search(vector<int>& nums, int target) {
for(int i=0;i<nums.size();i++)
{
if(nums[i]==target)
return i;
}
return -1;
}
};
b.二分查找法
注意点:要注意区间的闭合性,然后选择写法
一共有两种:第一种,左闭右闭区间。第二种,左闭右开区间。
先附上左闭右闭的代码
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0;
int right=nums.size()-1;
while(left<=right)
{
int middle=left+((right-left)/2);//也可以是middle=(left+right)/2,前面的写法是
//为了防止数据溢出
if(nums[middle]>target)
right=middle-1;
else if(nums[middle]<target)
left=middle+1;
else
return middle;
}
return -1;
}
};
第二种:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0;
int right=nums.size(); //因为右边是开区间,可以取数组的长度
while(left<right) //注意因为是右边是开区间所以不能等于
{
int mid=(left+right)/2;
if(nums[mid]>target)
right=mid; //因为右边是开区间不会取right的数据所以可以直接等于
else if(nums[mid]<target)
left=mid-1;
else
return mid;
}
return -1;
}
};
总结:
今天是第一天打卡算法,总体来说难度不是很大,关键在于认识到两种区间的数组然后是他的后续取边界的问题。但今天还有两个题还没做,做完作业继续冲数组的题。