首页 > 其他分享 >【leetcode】1.two sum

【leetcode】1.two sum

时间:2023-08-17 22:45:58浏览次数:40  
标签:target idx nums int sum two vector 哈希 leetcode

第一题给我干懵了...想达到这个要求把我脑壳都想痛了...Follow-up: Can you come up with an algorithm that is less than O(n2) time complexity?

一开始想过用map,但是不能解决重复key的问题。
然而我用sort,这个时间复杂度也不好确定。
假装我只用了O(n)!(搓手手)(溜走)xxx

class Solution {
public:
    
    
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<pair<int,int>> indexes;
        int len=nums.size();
        for(int i=0;i<len;i++){
            indexes.push_back(pair(nums[i],i));
        }
        

        sort(indexes.begin(),indexes.end());
        
        vector<int> result;
        int left=0,right=len-1;
        while(left<right){
            
            if(indexes[left].first+indexes[right].first==target){
                result.push_back(indexes[left].second);
                result.push_back(indexes[right].second);
                return result;
            }else if(indexes[left].first+indexes[right].first>target){
                right--;
            }else{
                left++;
            }
        }
        return result;
    }
};

贴一个做法。
这个思路:哈希表数和index,这个数进哈希表了key就按差值理解。每走过一个位置,在哈希表中找到对应的差值则返回{哈希表找到的差值index,当前位置},找不到则当前位置进哈希表。
时间复杂度O(n)
空间复杂度O(n)

class Solution {
public:
    
    
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> idx; // 创建一个空哈希表
        for (int j = 0;; j++) { // 枚举 j
            // 在左边找 nums[i],满足 nums[i]+nums[j]=target
            auto it = idx.find(target - nums[j]);
            if (it != idx.end()) // 找到了
                return {it->second, j}; // 返回两个数的下标
            idx[nums[j]] = j; // 保存 nums[j] 和 j
        }
    }
};

作者:灵茶山艾府
链接:https://leetcode.cn/problems/two-sum/solutions/2326193/dong-hua-cong-liang-shu-zhi-he-zhong-wo-0yvmj/

今日复习:
cpp中unorder_map和map的区别底层原理
sort简介

标签:target,idx,nums,int,sum,two,vector,哈希,leetcode
From: https://www.cnblogs.com/sharlynOUO/p/17639089.html

相关文章

  • LeetCode 1035.不相交的线
    1.题目:在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足满足: nums1[i]==nums2[j]且绘制的直线不与任何其他连线(非水平线)相交。请注意,连线即使在端点也不能相交:每个数字只......
  • Cogito, ergo sum
    ,sedminevolaspensi.Iwritethisarticlebecausemydeskmateiswriting.Butapparentlyit'sfarsimpler......
  • R语言:dplyr,根据ID合并列(summarise_all)
    原始数据df1如下所示,ID=3有重复行,对于重复的行,则合并列。IDVal1Val2Val302341532234334593259变成如下所示:IDVal1Val2Val302341532234334,2......
  • LeetCode 718.最长重复子数组
    1.题目:给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度 。 示例1:输入:nums1=[1,2,3,2,1],nums2=[3,2,1,4,7]输出:3解释:长度最长的公共子数组是[3,2,1]。示例2:输入:nums1=[0,0,0,0,0],nums2=[0,0,0,0,0]输出:52.代码:classSo......
  • LeetCode 1143.最长公共子序列
    1.题目:给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,"......
  • softmax,logsumexp, softmax的上溢(overflow)或下溢
    LSE:logsumexp   ......
  • Two-round n-out-of-n and Multi-Signatures and Trapdoor Commitment from Lattices
    Abstract.Althoughtheyhavebeenstudiedforalongtime,distributedsignatureprotocolshavegarneredrenewedinterestinrecentyearsinviewofnovelapplicationstotopicslikeblockchains.MostrecentworkshavefocusedondistributedversionsofE......
  • Leetcode 19. 删除链表的倒数第N个结点(Remove nth node from end of list)
    题目链接给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点.示例1:输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]示例2:输入:head=[1],n=1输出:[]提示:链表中结点的数目为sz1<=sz<=300<=Node.val<=1001<=n<=sz思路暴力解法:可以先......
  • 【题解】[ARC158C] All Pair Digit Sums
    传送门题目分析我们可以先从简单一点的情况开始分析,如果现在\(a_{[i]},a_{[j]}\)都不会进位,那么最后的\(f(a_{[i]}+a_{[j]})=f(a_{[i]})+f(a_{[j]})\)。证明如下:有两个数\(x=\overline{x_nx_{n-1}....x_1}\)和\(y=\overline{y_my_{m-1}...y_1}\)。令\(n\lem\),由于不会......
  • LeetCode 674.最长连续递增序列
    1.题目:给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。连续递增的子序列 可以由两个下标 l 和 r(l<r)确定,如果对于每个 l<=i<r,都有 nums[i]<nums[i+1] ,那么子序列 [nums[l],nums[l+1],...,nums[r-1],nums[r]] 就是连续递增......