川山甲

追求内心的非常平静!瞬间清空所有的杂念,达到物我两忘!

  博客园  :: 首页  ::  :: 联系 :: 订阅 订阅  :: 管理
  105 随笔 :: 0 文章 :: 1591 评论 :: 82万 阅读
 
问题
  
  
 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

 

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
 
代码实现
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <vector>
#include <map>
/**
*
*给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
*你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
*case:
*给定 nums = [2, 7, 11, 15], target = 9
*因为 nums[0] + nums[1] = 2 + 7 = 9
*所以返回 [0, 1]
*/
using namespace std;
class Solution {
public:
    // 两两对比的方式,时间复杂度为O(n2)
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> ret;
 
        // 第一种
        /*for (int i = 0; i < nums.size(); i++) {
            for (int j = i + 1; j < nums.size(); j++) {
                if (nums[i] + nums[j] == target) {
                    ret.push_back(i);
                    ret.push_back(j);
                    return ret;
                }
            }
        }*/
 
        // 第二种:数据插入到hashmap里,然后通过target - nums[i]来确定,时间复杂度为O(2n)
        map<int, int> m;
        for (int i = 0; i < nums.size(); i++) {
            m[nums[i]]  = i;
        }
        for (int i = 0; i < nums.size(); i++) {
            if (m.count(target - nums[i]) > 0 && i != m[target - nums[i]]) {
                ret.push_back(i);
                ret.push_back(m[target - nums[i]]);
                return ret;
            }
        }
        return ret;
    }
};

  

 

 
 
推荐
 
 
 
 
 
 
posted on   川山甲  阅读(1068)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示