leetcode刷题_day3

665.Non-decreasing Array

  1. 不会调用库函数就只能缝缝补补,但下场就是内存消耗和执行用时都很大。
  2. c++中的is_sorted函数可以检验序列是否按规定顺序排序。用法和sort函数一样
  3. 这道题我没有想到的一点是遇到nums[i]>nums[i+1]的情况时,可以把nums[i]的值赋给nums[i+1]带着新序列再去判断是否符合条件。我的做法时,当遇到不符合的情况时,去找附近的点判断是否可以更改,i取了初始值为1,这样才可以随时看nums[i-1]和nums[i+1]的情况。这样反而陷入了一个较为复杂且要不断细分if else的困境中。

附上自己的代码:

class Solution {
public:
    bool checkPossibility(vector<int>& nums) {
        int length = nums.size()-1;
        int flag=0;
        for(int i=1;i<length;++i)
        {
            if(nums[i-1]>nums[i] && nums[i-1]>nums[i+1])
            {
                if(i!=1 && nums[i-2]>nums[i])
                    return false;
                else if(i==1 && nums[i]>nums[i+1])
                    return false;
            }
            if(nums[i]<nums[i-1])
            {
                flag++;
                if(nums[length-1]>nums[length])
                    flag++;
                if(flag==2)
                    return false;
            }
        }
        return true;
    }
};

167.Two Sum II-Input array is sorted

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        int l=0, r=numbers.size()-1,sum;
        while(l<r)
        {
            sum = numbers[l] +numbers[r];
            if(sum == target)
                break;
            else if(sum > target)
                r--;
            else
                l++;

        }
        return (vector<int>{l+1,r+1});
    }
};

88.Merge Sorted Array

  1. 虽然知道这道题让用双指针,但是还是用了一种偷懒方法,擦除掉nums1的后面几个向量,然后将nums2插入到nums1后面,最后sort函数结尾。但是只有56/59的测试用例,其中num1为[0] 0 ,nums2为[1] 1 ,除了加一个判断条件之外暂时没想到更好的解决方法。
    (偷懒方法,56/59的测试用例)
class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        for(auto it =nums1.end()-1;it!=nums1.begin();it--)
            if(*it==0)
                it = nums1.erase(it);
            else if(*it!=0)
                break;
        for(auto num:nums2)
            nums1.push_back(num); 
        sort(nums1.begin(),nums1.end());    
    }
};

2.双指针做法
三个指针,两个指向nums1(不扩充时)和nums2的结尾,一个指向扩充后nums2的结尾,然后m<n时就去比较,m中最大的元素都放完了就一直放n。

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
      int pos = m-- + n-- -1;
      while(m>=0 && n>=0)
        if(nums1[m]>nums2[n])
        {
            nums1[pos] = nums1[m];
            --pos;
            --m;
        }
        else
        {
            nums1[pos] = nums2[n];
            --pos;
            --n; 
        }
        while(n>=0)
        {
            nums1[pos] = nums2[n];
            --pos;
            --n;
        }
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值