leetcode之深搜递归回溯类-----1/167/653. two sum(记忆化搜索寻找和为给定值的两个数)

1.two sum

如[2,5,7,11],target = 9,寻找数组中两个和为target的两个数

可以直接递归深搜,但会导致TLE

导致TLE代码:

    void helper (const vector<int>& nums, const int target, size_t idx, vector<int> cur, vector<int> &res) {
        if (idx <= nums.size()) {
            if (cur.size() == 2 && nums[cur[0]] + nums[cur[1]] == target) {
                res = cur;
                cur.pop_back();
            } else if (cur.size() > 2) {
                return;
            }
        }
        
        for (size_t i = idx; i < nums.size(); i++) {
            cur.push_back(i);
            helper(nums, target, i + 1, cur, res);
            cur.pop_back();
        }
    }


这种题尤其two sum需要直接找两个变量,用一个map记录每个数对应的索引,然后遍历每个数时寻找target-cur这个数在map里是否存在即可

题1代码:

vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> res;
        if (nums.empty()) {
            return res;
        }
        
        unordered_map<int, int> hmap;
        for (int i = 0; i < nums.size(); i++) {
            if (hmap.find(target - nums[i]) != hmap.end()) {
                res.push_back(i);
                res.push_back(hmap[target - nums[i]]);
                break;
            }
            hmap[nums[i]] = i;
        }
        
        return res;
    }


2.two sum

数组改为有序数组,需要升序输出索引,并且索引从1开始而不是从0开始

思路和上一题完全一样,注意因为是有序,所以在找到结果时,先push已存在的索引,然后push当前索引i

题167代码:

    vector<int> twoSum(vector<int>& numbers, int target) {
        vector<int> res;
        if (numbers.empty()) {
            return res;
        }
        
        unordered_map<int, int> hmap;
        for (int i = 0; i < numbers.size(); i++) {
            if (hmap.find(target - numbers[i]) != hmap.end()) {
                res.push_back(hmap[target - numbers[i]]);
                res.push_back(i + 1);
                break;
            }
            hmap[numbers[i]] = i + 1;
        }
        
        return res;
    }


3. two sum - input is a BST

输入改成在二叉树,但解法毫无区别,遍历改为前序递归二叉树即可

    bool helper (TreeNode *cur, const int k, unordered_set<int> &hset) {
        if (cur) {
            if (hset.find(k - cur->val) != hset.end()) {
                return true;
            }
            
            hset.insert(cur->val);
            if (helper(cur->left, k, hset)) {
                return true;
            }
            return helper(cur->right, k, hset);
        } else {
            return false;
        }
    }
    
    bool findTarget(TreeNode* root, int k) {
        if (!root) {
            return false;
        }
        
        unordered_set<int> hset;
        return helper(root, k, hset);
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值