三數(shù)之和 + 在排序數(shù)組中查找元素的第一個和最后一個位置

三數(shù)之和(中等)

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int n = nums.size();
        if(n == 0) return {};
        vector<vector<int>> res;
        
        for(int i =0; i <n-2 ;++i){
            if(nums[i] > 0) break;
            if(i!=0 && nums[i-1] == nums[i]) {continue;}
            int target = 0- nums[i];
            int j = n-1, k = i+1;
            while(k < j){
                int temp = nums[k] + nums[j];
                if( temp == target){
                    res.push_back({nums[i],nums[k],nums[j]});
                    k++; 
                    j--;
                    while(k< j && nums[k] == nums[k-1]) k++;
                    while(j >k &&nums[j] == nums[j+1]) j--;
                }
                else if(temp < target){k++;}
                else{
                    j--;
                }
            }
        }
        return res;
    }
};

在排序數(shù)組中查找元素的第一個和最后一個位置

二分法

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int n = nums.size();
        if(n == 0) return {-1,-1};//
        int l = 0, r = n-1,mid,resl=-1,resr=-1;
        while(l <= r){
            int mid = l+ (r-l)/2;
            if(nums[mid] <= target){if(nums[mid] == target){resr = mid;}l = mid+1;}
            else if(nums[mid] > target){r =mid-1;}
            
        }
        int left = 0, right = n-1;
         while(left <= right){
            int mid = left+ (right-left)/2;
            if(nums[mid] < target){left = mid+1;}
            else if(nums[mid] >= target){if(nums[mid] == target){resl = mid;};right =mid-1;}
            
        }
        if(resl == -1||resr==-1) return {-1,-1};
        return {resl,resr};
    }
};

搜索旋轉(zhuǎn)排序數(shù)組

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int lo = 0, hi = nums.size() - 1;
        while (lo < hi) {
            int mid = (lo + hi) / 2;
            if ((nums[0] > target) ^ (nums[0] > nums[mid]) ^ (target > nums[mid]))
                lo = mid + 1;
            else
                hi = mid;
        }
        return lo == hi && nums[lo] == target ? lo : -1;
    }
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容