34. 在排序数组中查找元素的第一个和最后一个位置的思路的菜鸟总结

原题链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/description/

题目描述:

给定一个按照升序排列的整数数组 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.偷懒不愿意思考。如果是困难题目一定会将题型设置难的同时增加数据的检查,如果不勤加思考,以后的疏漏会越来越无法弥补。

希望自己能吸取教训,不要浪费做题目的时间与经验吧。

猜你喜欢

转载自blog.csdn.net/thunderforrain/article/details/81163291