代码随想录算法训练营第一天补充题目代码及错因总结

  • 二分查找

35题 


class Solution {

public:

    int searchInsert(vector<int>& nums, int target) {

        int left = 0;

        int right = nums.size()-1;

        while(left<= right){

            int middle = left+((right-left)>>1);

            if(target>nums[middle]){

                left = middle+1;

            }

            else if(target<nums[middle]){

                right = middle-1;

            }

            else

            return middle;  

        }

        return left;

    }

};

34题

class Solution {

public:

    vector<int> searchRange(vector<int>& nums, int target) {

        vector<int> result = GetBoard(nums, target);

        if(result[0]==-2||result[1]==-2)

        return {-1,-1};

        if (result[1] - result[0] > 1)

            return {result[0] + 1, result[1] - 1};

        return {-1, -1};

    }



private:

    vector<int> GetBoard(vector<int>& nums, int target) {

        vector<int> result = {-2, -2};

        int right = nums.size() - 1;

        int left = 0;

        while (left <= right) {

            int middle = left + ((right - left) >> 1);

            if (nums[middle] >= target) {

                right = middle - 1;

                result[0] = right;



            } else if (nums[middle] < target) {

                left = middle + 1;

            }

        }

        right = nums.size() - 1;

        left = 0;

        while (left <= right) {

            int middle = left + ((right - left) >> 1);

            if (nums[middle] > target) {

                right = middle - 1;



            } else if (nums[middle] <= target) {

                left = middle + 1;

                result[1] = left;

            }

        }



        return result;

    }

};

69题 注意这里的mid需设置成 long long ,因为mid*mid的返回类型默认与mid一致,但是无需把x设为long long

class Solution {

public:

    int mySqrt(int x) {

        if (x < 1)

            return 0;

       

        int left = 1, right = x;

        while (left < right) {

           

            long long mid = left + (right - left + 1) / 2;

            if (mid * mid <= x)

                left = mid;

            else

                right = mid - 1;

        }

        return left;

    }

};

367题

class Solution {

public:

    bool isPerfectSquare(int num) {

        int left=0;

        int right = num;

        while(left<=right){

            long double middle=left+((right-left)>>2);

            if(middle*middle>num){

                    right=middle-1;

            }else if(middle*middle<num){

                left=middle+1;

            }else{

                long long mid =middle;

                if(mid*mid==num)

                return true;

            }

        }

        return false;

    }

};
  • 移除元素

26题 前后都容易溢出,需要小心!

class Solution {

public:

    int removeDuplicates(vector<int>& nums) {

        int fast = 0;

        int slow = 0;

        for (fast = 0; fast < nums.size() - 1; fast++) {



            if (nums[fast] != nums[fast + 1])

                nums[slow++] = nums[fast];

        }



        if (nums[fast] != nums[slow]) {

            nums[slow++] = nums[fast];

        } else {

            nums[slow++] = nums[fast];



            return slow;

        }

        return slow;

    }

};

283题

class Solution {

public:

    void moveZeroes(vector<int>& nums) {

        int fast=0;

        int slow =0;

        int count=0;

        int size=nums.size();

        for(fast=0;fast<size;fast++){

            if(nums[fast]!=0){

                nums[slow++]=nums[fast];

            }else

           {count++;

           }

        }

        for(int i=0;i<count;i++){

            nums[size-1-i]=0;

        }



    }

};

844题 注意指针传参

class Solution {

public:

        bool backspaceCompare(string s, string t) {

        int l = 0;

        int l_1 = 0;

                s = Back_delete(s, &l);

                t = Back_delete(t, &l_1);

//         cout << s << '\n' << t;

//         cout << l << l_1;

        if (l != l_1)

            return false;

        for (int j = 0; j < l; j++) {

            if (s[j] != t[j]) {

                return false;

            }

        }

        return true;

           

    }



private:

        string Back_delete(string s, int* l) {

                int fast = 0;

                int slow = 0;

        int count = 0;

        int size = s.length();

                for (fast = 0; fast < size; fast++) {

                        if (s[fast] != '#') {

                                s[slow++] = s[fast];

                           

            }



            else  {

               

                if (slow > 0)

                                    slow--;

                    count++;



//                 if (fast == size) {

//                     s[slow] = '0';

//                 }

                           

            }

                   

        }



//         for (int i = 0; i < 2 * count; i++) {

//             s[size - 1 - i] = '0';

//         }

        *l = slow;

                return s;

           

    }

};

977题 前后双指针 注意vector初始化是 名(size,0),不是 名=(size,0)

class Solution {

public:

    vector<int> sortedSquares(vector<int>& nums) {

       

        vector<int> result(nums.size(),0);

        int j = nums.size()-1;

        int k = nums.size()-1;

        for(int i=0;i<=j;){

            if(nums[j]*nums[j]>nums[i]*nums[i]){

                result[k--]=nums[j]*nums[j];

                j--;

            }else{

                result[k--]=nums[i]*nums[i];

                i++;

            }

        }

        return result;

    }

};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值