【复习】算法求和题总结C++

1. 两数之和

leetcode1

输入
nums = [2, 6, 11, 15], target = 8
输出
[0, 1]
因为 nums[0] + nums[1] = 2 + 6 = 8

  • 可用暴力解法,双循环解决,时间复杂度为 O ( n 2 ) O(n^2) O(n2),空间复杂度: O ( 1 ) O(1) O(1)
  • 使用hash表,实现快速搜索,以空间换取速度,时间复杂度为 O ( n ) O(n) O(n),空间复杂度: O ( n ) O(n) O(n)
  • 使用双循环,c++中使用容器map实现(map有各种类型的Key - value对应)
vector<int> twoSum(vector<int>& nums, int target) {

        map<int, int> maplist;
        int a=0,b=0;
        vector<int> ans;

        for(int i=0; i<nums.size(); i++) 
            maplist[nums[i]] = i;

        for(int a=0; a<nums.size(); a++){
   
            int b = maplist[target - nums[a]];
            if(b && b != a){
                    ans.push_back(a);
                    ans.push_back(b);
                    return ans;
            } 
        }
        return {};
    }
  • 简化双循环,使用单循环
vector<int> twoSum(vector<int>& nums, int target) {

        map<int, int> maplist;
        vector<int> ans;

        for(int a=0; a<nums.size(); a++){

            if(maplist.count(target - nums[a]) && maplist[target - nums[a]] != a){
                    ans.push_back(maplist[target - nums[a]]);
                    ans.push_back(a);
                    return ans;
            }
            maplist[nums[a]] = a;
        }
        return {};
    }

你可能感兴趣的:(面试笔试题)