zoukankan      html  css  js  c++  java
  • [leetcode]3Sum

    给一个数组,球里面所有满足 a+b+c = 0的元素

    T_T开始想的是hash,然后查0-a-b这个。

    但是发现不好处理重复元素的问题。

    T_T,那就这样。。。排序。。。然后二分

    先枚举a

    for(int i = 0 ; i < cap-2 ; i++)

    这样也会有重复的问题,所以下个i不应该是i++而且,刚好大于num[i]的那个位置

    同理j也是

    然后再用二分查找0-a-b这个数是否存在。

    当然为了保证不重复,我们另a <= b <= c ,所以只查找后面的元素

    class Solution {
    public:
        int upper(int start , int end , vector<int> &num , int target){
            int l = start;
            int r = end - 1;
            while(l <= r){
                int mid = (l + r) / 2;
                if(num[mid] <= target) l = mid + 1;
                else r = mid -1; 
            }
            return l;
        }
        bool bsearch(int start , int end , vector<int>&num , int target){
            int l = start;
            int r = end - 1;
            while(l <= r){
                int mid = (l + r) / 2;
                if(num[mid] == target) return true;
                else if(num[mid] > target) r = mid - 1;
                else l = mid + 1;
            }
            return false;
        }
        vector<vector<int> > threeSum(vector<int> &num) {
            // Note: The Solution object is instantiated only once and is reused by each test case.
            vector<vector<int> >ans;
            if (num.size() < 3) return ans;
            sort(num.begin() , num.end());
            int cap = num.size();
            for(int i = 0 ; i < cap - 2 ; i = upper(i , cap-2 , num , num[i])){
                for(int j = i + 1 ; j < cap - 1 ; j =upper(j , cap-1 , num , num[j])){
                    if(bsearch(j + 1, cap , num , 0 - num[i] - num[j])){
                        vector<int> tmp;
                        tmp.push_back(num[i]);tmp.push_back(num[j]);tmp.push_back(0 - num[i] - num[j]);
               //         cout << num[i] << " " << num[j] << " " << (0 - num[i] - num[j]) << endl;
                        ans.push_back(tmp);
                    }
                }
            }
            return ans;
        }
    };
    

      

    class Solution {
    public:
        int up(const vector<int>& num, int left) {
            int l = left;
            int r = num.size() - 1;
            int key = num[left];
            while(l <= r) {
                int mid = l + (r - l) / 2;
                if (num[mid] > key) r = mid - 1;
                else  l = mid + 1;
            }
            return l;
        }
        bool bs(const vector<int>& num, int left, int target) {
            int l = left;
            int r = num.size() - 1;
            while(l <= r) {
                int mid = l + (r - l) / 2;
                if (num[mid] == target) return true;
                if (num[mid] < target) l = mid + 1;
                else r = mid - 1;
            }
            return false;
        }
        vector<vector<int> > threeSum(vector<int> &num) {
            vector<vector<int> > ans;
            if (num.size() < 3) return ans;
            sort(num.begin(), num.end());
            for (int i = 0; i < num.size() - 2; i = up(num, i)) {
                for (int j = i + 1; j < num.size() - 1; j = up(num, j)) {
                    bool find = bs(num, j + 1, 0 - num[i] - num[j]);
                    if (find) {
                        vector<int> tmp;
                        tmp.push_back(num[i]);tmp.push_back(num[j]);tmp.push_back(0 - num[i] - num[j]);
                        ans.push_back(tmp);
                    }
                }
            }
            return ans;
        }
    };
  • 相关阅读:
    qt中文乱码问题
    【Qt开发】QThread 实用技巧、误区----但文档中没有提到
    TCP/UDP网络性能测试工具
    wireshark怎么抓包、wireshark抓包详细图文教程
    INDEX--从数据存放的角度看索引2
    杂谈--从基数评估来看问题1
    INDEX--从数据存放的角度看索引
    疑难杂症--为数据库主文件所在磁盘保留一定量磁盘空间
    统计--VARCHAR与NVARCHAR在统计预估上的区别
    杂谈--SQL SERVER版本
  • 原文地址:https://www.cnblogs.com/x1957/p/3370040.html
Copyright © 2011-2022 走看看