题目描述:
给定一个按照升序排列的整数数组 nums
,和一个目标值 target
。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]
。
思路:
原本以为只有两组数据测试,没有更多过难的数据测试,放松了警惕,两组数据如下:
示例 1:输入: nums = [5,7,7,8,8,10]
, target = 8 输出: [3,4]
示例 2:输入: nums = [5,7,7,8,8,10]
, target = 6 输出: [-1,-1]
对应代码只有:
for(int i=0;i<nums.size();i++){
if(nums[i]==target&&k==0) {
k++;
a[0]=i;
}
if(nums[i]==target&&k==1) a[1]=i;
}
但是随着提交错误的产生,我越发知道自己的错误在哪:
首先,我没有考虑数组为零的情况,而且审题不清,题目要求是不存在目标数值则返回【-1,-1】,我却擅自返回了【0】
if(nums.size()==0) return a;
再者,我没有考虑到【1】,1的数据情况,此时应该返回【0,0】,代码如下:
if(nums.size()==1){
if(nums[0]==target) {
a[0]=a[1]=0;
return a;
最后还有一点,我没有在if(nums.size()==1) 分支语句下判断与目标值不同的情况,下面是改正后的分支语句:
else if(nums.size()==1){
if(nums[0]==target) {
a[0]=a[1]=0;
return a;
}
else return a;
}
最后考虑,其实可以使用switch语句来做这个题目,这样可以减少代码量。
源代码:
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int k=0;
vector<int>a(2,-1);
if(nums.size()==0) return a;
else if(nums.size()==1){
if(nums[0]==target) {
a[0]=a[1]=0;
return a;
}
else return a;
}
else{
for(int i=0;i<nums.size();i++){
if(nums[i]==target&&k==0) {
k++;
a[0]=i;
}
if(nums[i]==target&&k==1) a[1]=i;
}
return a;
}
}
};
总结:
1.思想懈怠。自己很少有参赛的经历,并不知道中等题会检查那么多组数据(88),思路上有些地方没有过多考虑。
2.基础不牢,对vector的用法还很迷茫。其作为返回值的情况我都已经忘记了,做该题目时我用专门从网上搜索了相关的知识。
3.偷懒不愿意思考。如果是困难题目一定会将题型设置难的同时增加数据的检查,如果不勤加思考,以后的疏漏会越来越无法弥补。
希望自己能吸取教训,不要浪费做题目的时间与经验吧。