码迷,mamicode.com
首页 > 其他好文 > 详细

0207今天是15的一天冲鸭

时间:2020-02-07 12:51:30      阅读:59      评论:0      收藏:0      [点我收藏+]

标签:疑问   越界   war   api   first   sort   vector   部分   情况   

歧路亡羊是目前的很大敌人,故,统一处理,集中兵力成了我最重要的事情,但凡学习必须专注,否则宁可不学,只有投入和专注才能真正打赢这场仗

疑问:

1.sort函数的[]

优点:

1.从1开始回减,有效控制范围

class Solution {
public:
    bool canAttendMeetings(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){return a[0] < b[0];});
        for (int i = 1; i < intervals.size(); ++i) {
            if (intervals[i][0] < intervals[i - 1][1]) {
                return false;
            }
        }
        return true;
    }
};

LC278

这道题最重要的是,终止条件的判别。避免陷入死循环。对mid的计算不能直接(left+right)/2,会导致左右太大时,越界,left+(right-left)/2则是一定不会越界的方法,非常好,值得肯定。

此外题干说尽量少用判别函数,所以判别函数虽然也可以决定是否终止,我们应该选择更好的判别方法

// Forward declaration of isBadVersion API.
bool isBadVersion(int version);

class Solution {
public:
    int firstBadVersion(int n) {
        int left = 0, right = n; //[left, right]
        //用这种一定有界的循环,尽量少使用while 1这种情况,避免死循环超时
        while (left <= right) {
            int mid = left + (right - left) / 2;
            //题干说尽量少使用判断的调用
            if (isBadVersion(mid)) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return left;
    }
};

LC283

双指针法,优点:

指针是一种方法名称,并非必须得要指针,用下标一样作用,要领会精神

swap是在std空间的,可以大胆使用

疑问:

swap能交换什么种类的值

答疑:

大部分类型包括vector都可以直接交换

// swap algorithm example (C++98)
#include <iostream>     // std::cout
#include <algorithm>    // std::swap
#include <vector>       // std::vector

int main () {

  int x=10, y=20;                              // x:10 y:20
  std::swap(x,y);                              // x:20 y:10

  std::vector<int> foo (4,x), bar (6,y);       // foo:4x20 bar:6x10
  std::swap(foo,bar);                          // foo:6x10 bar:4x20

  std::cout << "foo contains:";
  for (std::vector<int>::iterator it=foo.begin(); it!=foo.end(); ++it)
    std::cout <<   << *it;
  std::cout << \n;

  return 0;
}

 

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        for (int i = 0, j = 0; i < nums.size(); ++i) {
            if (nums[i]) {
                swap(nums[i], nums[j++]);
            }
        }
    }
};

ps:vector的remove函数只是把后面的数字往前提,但是并不会把要去掉的数字向后挪

eg:1,0,2,0,3

remove(vec.begin(),vec.end(),0)

1,2,3,0,3

后面原来的东西是不变的

解法二虽然写着复杂但时空复杂度与1相似,自带函数比较快

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int n=nums.size();
        // if(n==0) return;
        nums.erase(remove(nums.begin(),nums.end(),0),nums.end());
        int n1=nums.size();
        if(n1!=n)
        {
            vector<int> ad(n-n1,0);
            nums.insert(nums.end(),ad.begin(),ad.end());
        }
        
    }
};

 

0207今天是15的一天冲鸭

标签:疑问   越界   war   api   first   sort   vector   部分   情况   

原文地址:https://www.cnblogs.com/Marigolci/p/12272395.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!