• leetCode刷题(持续更新c++解法)


    1.two sum

    思路:一次遍历+hash

    class Solution {
    public:
        vector<int> twoSum(vector<int>& nums, int target) {
            unordered_map<int,int> a;
            vector<int> b;
            for(int i = 0; i < nums.size(); i++) {
                a[nums[i]] = i;
            }
            for(int i = 0; i < nums.size(); i++) {
                int x = target - nums[i];
                if(a.count(x) && a[x] != i) {
                    b.push_back(i);
                    b.push_back(a[x]);
                    break;
                }
            }
            return b;
        }
    };
    

    167. Two Sum II - Input array is sorted

    思路:双指针遍历

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

    15.3sum

    //问题:找数组中和为0的三元组
    //方法:排序后,扫描数组,转化为2sum问题
    //2sum对应一个循环,3sum对应两重循环,4sum对应三重循环
    class Solution {
    public:
        vector<vector<int>> threeSum(vector<int>& nums) {
            vector<vector<int> > a;
            if(nums.size() < 3)
                return a;
            sort(nums.begin(),nums.end()); 
            for(int i = 0; i < (int)nums.size()-2; i++) {
                if(nums[i] > 0) 
                    break;
                if(i > 0 && nums[i-1] == nums[i])   //相同则继续找下一个数
                    continue;
                int l = i+1,r = (int)nums.size() - 1;
                int target = 0-nums[i];
                while(l < r) {
                    if(nums[l] + nums[r] == target) {
                        a.push_back({nums[i],nums[l],nums[r]});
                        while(l < r&&nums[l] == nums[l+1])  //如果相同则继续找下个数
                            l++;
                        while(l < r&&nums[r] == nums[r-1])
                            r--;
                        l++,r--;
                    }
                    else if(nums[l] + nums[r] < target)
                        l++;
                    else
                        r--;
                }
            }
            return a;
        }
    };
    

    16.3sum closest

    问题:离目标值最近的三数之和
    方法:排序后,扫描a[i],后面在用left和right首尾两指针扫描
    class Solution {
    public:
        int threeSumClosest(vector<int>& nums, int target) {
            if(nums.size() < 3)
                return 0;
            int closest = nums[0] + nums[1] + nums[2];
            int diff = abs(closest - target);
            sort(nums.begin(),nums.end());
            for(int i = 0; i < nums.size() - 2; i++) {
                int l = i+1, r = nums.size() - 1;
                while(l < r) {
                    int sum = nums[i] + nums[l] + nums[r];
                    int x = abs(sum - target);
                    if(x < diff) {
                        diff = x;
                        closest = sum;
                    }
                    if(sum < target) 
                        l++;
                    else
                        r--;
                }
            }
            return closest;
        }
    };
    

    18.4sum

    /*
    问题:找与目标值相等的4个数
    三重循环即可
    用set可避免重复结果
    */
    class Solution {
    public:
        vector<vector<int>> fourSum(vector<int>& nums, int target) {
            if(nums.size() < 4) 
                return vector<vector<int>>();
            set<vector<int>> res;
            sort(nums.begin(),nums.end());
            for(int i = 0; i < nums.size()-3; i++) {
                for(int j = i+1; j < nums.size() - 2; j++) {
                    int l = j + 1,r = nums.size() - 1;
                    while(l < r) {
                        int sum = nums[i] + nums[j] + nums[l] + nums[r];
                        if(sum == target) {
                            vector<int> s{nums[i],nums[j],nums[l],nums[r]};
                            res.insert(s);  //set有重复时插入不进去
                            l++,r--;
                        }
                        else if(sum > target) {
                            r--;
                        }
                        else{
                            l++;
                        }
                    }
                }
            }
            return vector<vector<int>> (res.begin(),res.end());  //讲set转为vector输出
        }
    };
    

    217. Contains Duplicate

    问题:判断一个数组是否含重复元素
    方法:用map统计每个元素出现的次数
    此题比较简单,方法很多
    class Solution {
    public:
        bool containsDuplicate(vector<int>& nums) {
            unordered_map<int,int> dict;
            for(int i:nums) {
                dict[i]++;
                if(dict[i] > 1) {
                    return true;
                }
            }
            return false;
        }
    };
    

    26. Remove Duplicates from Sorted Array

    问题:去除有序序列中的重复数字
    方法一:双指针法(覆盖法)
    当a[i] != a[index-1] 用a[i]覆盖a[index]
    相等时不覆盖,不等时覆盖,index代表了新数组的索引,i代表了旧数组索引,将无重复数依次移动到前面
    class Solution {
    public:
        int removeDuplicates(vector<int>& nums) {
            if(nums.empty()) {
                return 0;
            }
            int index = 1;
            for(int i = 0; i < nums.size(); i++) {
                if(nums[i] != nums[index-1]){
                    nums[index] = nums[i];
                    index++;
                }
            }
            return index;
        }
    };
    

      

  • 相关阅读:
    C#中using的使用方法
    Silverlight性能优化纪要原作者Jossef Goldberg
    ASP.NET 获取客户端IP地址
    Silverlight性能优化【转】
    WCF 异常集
    js 其他事件
    ajax等待层
    DEVEXPRESS 破解方法
    类型“Microsoft.Office.Interop.Word.ApplicationClass”未定义构造函数
    js表单相关事件
  • 原文地址:https://www.cnblogs.com/clb123/p/13605928.html
Copyright © 2020-2023  润新知