首页 > 其他分享 >leetcode 1. 两数之和 暴力穷举 排序 哈希表 时间比较

leetcode 1. 两数之和 暴力穷举 排序 哈希表 时间比较

时间:2023-02-21 17:34:09浏览次数:34  
标签:target nums int ret vector 哈希 穷举 include 两数

暴力 O(n*n)

#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <map>
#include <unordered_map>
using namespace std;
// 暴力 O(n*n)
class Solution {
public:
    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[j] == target - nums[i]) {
                    ret.push_back(i);
                    ret.push_back(j);
                    return ret;
                }
            }
        }
        return ret;
    }
};

int main()
{
    Solution Solution1;
    vector<int> nums = {2,7,11,15};
    vector<int> ret = Solution1.twoSum(nums,9);
    for(auto i:ret){
        cout<<i<<endl;
    }
    return 0;
}

leetcode 1. 两数之和  暴力穷举 排序 哈希表 时间比较_i++

排序 O(nlog(n))
需要构造一个pair<int,int>记录位置,将元素和位置一起排序

#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <map>
#include <unordered_map>
using namespace std;
//排序 O(nlog(n))

class Solution {
public:
    static bool cmp(pair<int ,int> a,pair<int ,int> b){
        return a.second < b.second;
    }
    vector<int> twoSum(vector<int>& nums, int target) {
        vector< pair<int ,int> > ve;
        for(int i=0;i<nums.size();i++){
            pair<int ,int> pa(i,nums[i]);
            ve.push_back(pa);
        }
        sort(ve.begin(),ve.begin() + ve.size(),cmp);
        int i=0, j=nums.size()-1;
        vector<int> ret;
        while(i<j){
            if(ve[i].second + ve[j].second > target){
                j--;
            }else if(ve[i].second + ve[j].second < target){
                i++;
            }else{
                ret.push_back(ve[i].first);
                ret.push_back(ve[j].first);
                return ret;
            }
        }
        return ret;
    }
};

int main()
{
    Solution Solution1;
    vector<int> nums = {2,7,11,15};
    vector<int> ret = Solution1.twoSum(nums,9);
    for(auto i:ret){
        cout<<i<<endl;
    }
    return 0;
}

leetcode 1. 两数之和  暴力穷举 排序 哈希表 时间比较_i++_02

map O(nlog(n))
map 访问时间logN
一共访问N次
时间提升不少

#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <map>
#include <unordered_map>
using namespace std;

// 哈希 map O(nlog(n))

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        map<int,int>mp;
        vector<int> ret;
        for(int i=0;i<nums.size();i++){
            mp[nums[i]] = i+1;
        }
        for(int i=0;i<nums.size();i++){
            if( mp[ target-nums[i] ] > 0 &&  mp[ target-nums[i] ]-1!=i ){
                ret.push_back(i);
                ret.push_back(mp[ target - nums[i] ]-1);
                return ret;
            }
        }
        return ret;
    }
};

int main()
{
    Solution Solution1;
    vector<int> nums = {2,7,11,15};
    vector<int> ret = Solution1.twoSum(nums,9);
    for(auto i:ret){
        cout<<i<<endl;
    }
    return 0;
}

leetcode 1. 两数之和  暴力穷举 排序 哈希表 时间比较_i++_03

据说unordered_map访问是O(1) 但是未见时间明显提升

#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <map>
#include <unordered_map>
using namespace std;

// 哈希 unordered_map O(n)
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int>mp;
        vector<int> ret;
        for(int i=0;i<nums.size();i++){
            mp[nums[i]] = i+1;
        }
        for(int i=0;i<nums.size();i++){
            if( mp[ target-nums[i] ] > 0 &&  mp[ target-nums[i] ]-1!=i ){
                ret.push_back(i);
                ret.push_back(mp[ target - nums[i] ]-1);
                return ret;
            }
        }
        return ret;
    }
};

int main()
{
    Solution Solution1;
    vector<int> nums = {2,7,11,15};
    vector<int> ret = Solution1.twoSum(nums,9);
    for(auto i:ret){
        cout<<i<<endl;
    }
    return 0;
}

leetcode 1. 两数之和  暴力穷举 排序 哈希表 时间比较_两数字之和_04

标签:target,nums,int,ret,vector,哈希,穷举,include,两数
From: https://blog.51cto.com/liyunhao/6076888

相关文章

  • 代码随想录打卡第5天 |有效的字母异位词, 两个数组的交集, 快乐数,两数之和
    有效的字母异位词1,用一个长度为26的数组s[s.charAt(i)-'a']存大于0说明有多 小于0说明缺少两个数组的交集1,用两个set集合第一个set集合存t,第二个set用......
  • LeetCode题2两数相加
    2.两数相加分析题目比较简单,就是两个数相加求和。按照加法思想,同时遍历两个链表,从个位一直加到最高位即可。比如要计算352+99,步骤如下:最低位2+9得11,需进位,个位保留......
  • 算法刷题-无重复字符的最长子串(哈希表、字符串)、数字 1 的个数(递归、数学)、对称二
    无重复字符的最长子串(哈希表、字符串)给定一个字符串,请你找出其中不含有重复字符的**最长子串**的长度。示例1:输入:s="abcabcbb"输出:3解释:因为无重复字符......
  • Leetcode题1两数之和 JavaScript语言
    1.两数之和方案一,暴力双循环读完题目,马上能想到的方案就是双循环,挨个排查,写出来也很快:vartwoSum=function(nums,target){constlen=nums.length;for......
  • 2. 两数相加
    给你两个 非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和......
  • day6 | 哈希表(1)
    什么时候能用到哈希表呢?给你一个元素,判断这个元素在集合中是否出现过。什么时候用set?数值很大,数值分布很分散,用数组下标来进行映射就会浪费很大的存储空间 题目链接:2......
  • java 哈希值
    java哈希值           ......
  • 转:图片哈希概论及python中如何实现对比两张相似的图片
    Google以图搜图的原理,其中的获取图片hash值的方法就是AHash。每张图片都可以通过某种算法得到一个hash值,称为图片指纹,两张指纹相近的图片可以认为是相似图片。以图......
  • acwing 我在哪?(字符串哈希)
    原题链接题解分析设答案为ans,那么大于ans,肯定不成立,小于ans成立,这符合二分答案的特点然后使用unordered_set和substr进行查重substr:第一个参数为开始项,第二个参数......
  • 【力扣题目】两数相加(链表)
    https://leetcode.cn/problems/add-two-numbers/1/**2*Definitionforsingly-linkedlist.3*publicclassListNode{4*intval;5*List......