leetcode刷题01 两数之和(复习容器的用法)

 

1. 两数之和

随机一题


给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

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

示例:

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

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

 思路:

简单粗暴的for循环,这里主要复习一下容器的用法。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
       int i=0,j=0;
    vector<int> result(2,0);
    int length = nums.size();
   // int length = s1 / s2;
    for(i=0;i<length;i++)
        {
            for(j=i+1;j<length;j++)
            {
                if(nums[i]+nums[j]==target)
                {
                    result[0]=i;
                    result[1]=j;
                    return result;
                }
            }
        }
        
    }
};

 复习一下容器的用法:

复习笔记:

容器vector<int>的用法:
    1.声明及初始化
vector<int> a;    //声明一个int型向量a
vector<int> a(10);    //声明一个初始大小为10的向量
vector<int> a(10, 1);    //声明一个初始大小为10且初始值都为1的向量
 
vector<int> b(a);    //声明并用向量a初始化向量b
vector<int> b(a.begin(), a.begin()+3);    //将a向量中从第0个到第2个(共3个)作为向量b的初始值   
 
int n[] = {1, 2, 3, 4, 5};
vector<int> a(n, n+5);    //将数组n的前5个元素作为向量a的初值
vector<int> a(&n[1], &n[4]);    //将n[1] - n[4]范围内的元素作为向量a的初值
 2.添加元素

vector<int> a;
a.push_back(1);    //在尾部加入一个数据
a.push_back(2);
a.pop_back();      //删除最后一个数据
a.insert(a.begin(), 0);    //在a.begin()之前加入0
a.erase(a.begin());    //将a.begin()的元素删除
a.erase(a.begin() + 1, a.end());    //将第二个元素以后的元素均删除


 3.判断vector是否为空
vector<int> a;
if(a.empty()){
    a.push_back(1);
}


 4.遍历访问vector

vector<int> a;
//像数组一样以下标访问 
for(int i = 0; i < a.size(); i++){
    cout << a[i];
}
 
//以迭代器访问
vector<int>::iterator it;
for(it=a.begin(); it!=a.end(); it++){
    cout<<*it<<" " ;
}
 5.排序必须包含algorithm头文件
#include <algorithm>
 
vector<int> a;
sort(a.begin(), a.end());
    
6.以vector实现二维数组
7.vector的长度获取 nums.size()
8.数组的长度获取 sizeof(a)
9.数组的动态申请 int result = new int [num];


vector<vector<int>> a(10, vector<int>(5));    //创建一个10行5列的int型二维数组 相当于a[10][5];

 更新方法:

方法二:两遍Hash表

public static int[] twoSum02(int[] nums, int target) {
    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    for(int i = 0; i < nums.length; i++) {
        map.put(nums[i], i);
    }
    for(int i = 0; i < nums.length; i++) {
        int complement = target - nums[i];
        if(map.containsKey(complement) && map.get(complement) != i) {
            return new int[] {i, map.get(complement)};
        }
    }
    throw new IllegalArgumentException("No two sum solution");
}

1、为了对运行时间复杂度进行优化,我们需要一种更有效的方法来检查数组中是否存在目标元素,如果存在,我们需要

找出它的索引.保持数组中的每个元素与其索引相互对应的最好办法就是hHsh表

2、时间复杂度:O(n), 我们把包含有 nn 个元素的列表遍历两次。由于哈希表将查找时间缩短到 O(1)O(1)

,所以时间复杂度为 O(n)O(n)。

3、空间复杂度:O(n)O(n), 所需的额外空间取决于哈希表中存储的元素数量,该表中存储了 nn 个元素。

方法三:一遍Hash表:
public static int[] twoSum03(int[] nums, int target) {
    Map<Integer, Integer> map = new HashMap<>();
    for(int i = 0; i < nums.length; i++) {
        map.put(nums[i], i);
        int complement = target - nums[i];
        if(map.containsKey(complement)) {
            return new int[] {map.get(complement), i};
        }
    }
    throw new IllegalArgumentException("No two sum solution");
}
 

猜你喜欢

转载自blog.csdn.net/honry55/article/details/81984496
今日推荐