【数据结构与算法】(一)数组

知识点:

C++ sort   快排

而且vector,set,map这些容器的end()取出来的值实际上并不是最后一个值,而end的前一个才是最后一个值!

需要用prev(xxx.end()),才能取出容器中最后一个元素。

 

通过使用 * vector.begin() 或 *( vector.end()-1) 来获得 vector 中第一个或最后一个的值;

也可以直接使用 vector.front() 、vector.back() 来得到 vector 首尾的值。

 

三数之和 

解体思路,首先排序,排序后,c指向的是第一个数据, first 是从c的下一个开始往右遍历,last 是从最后一个数据开始,往左遍历。

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> result;
        sort(nums.begin(),nums.end());     //首先排序  
        
        vector<int>::iterator c,first,last;   //使用双指针
        if(nums.size()<3||nums.front()>0 || nums.back()<0)
            return {};                                      //要特别注意  nums.end()-1 指向的才是最后一个数据
        for(c=nums.begin();c!=(nums.end()-2);c++){
           if(*c>0) break;
           if(*c==0){
               if(*(c+1)==0&&*(c+2)==0){
                   vector<int> value={0,0,0};
                   result.push_back(value);
                   break;
               }else break;
                  
           }
           if(c>nums.begin()&&*c==*(c-1))  continue;               
           
           first=c+1;
           last=nums.end()-1;
           while(first<last){
               
               if(first-1>=c+1){
                   if(*(first-1)==*first){
                       first++;
                       continue;
                   }
               }
               
               int count=*c+*first+*last;
               if(count==0){
                  
                   vector<int> value={*c,*first,*last};
                   result.push_back(value);
                   first++;
                   last--;
                   continue;
                  
               }
               if(count>0){
                   last--;
               }else {
                   first++;
               }
           }
        }
       
        return result;
    }
};

 

posted @ 2019-08-16 17:34  xiaoxiaowenge  阅读(288)  评论(0)    收藏  举报