LeetCode_Two Sum

一.题目

Two Sum

Total Accepted: 69820 Total
Submissions: 386081My
Submissions

Given an array of integers, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2)
are not zero-based.

You may assume that each input would have exactly one solution.

Input: numbers={2, 7, 11, 15}, target=9

Output: index1=1, index2=2

Show Tags

Have you met this question in a real interview?

Yes

No

Discuss

二.解题技巧

这道题最简单的做法是使用暴力算法来做,虽然空间复杂度为O(1),但是时间复杂度为O(n^2)。我一开始使用的暴力算法,结果提交之后直接提示运行时间过长,因此,本题的答案并不是暴力算法。

如果包含有n个元素的数组A是排好序的,设置Head=0, End=n-1, 对于A[Head]+A[End]和目标target,存在下面三种情况:

1.(A[Head]+A[End])==target,那么A[Head]和A[End]就是能够满足条件的两个元素,判断结束。

2.(A[Head]+A[End])>target, A[End]就不可能是满足条件的元素,因此,End = End - 1,继续进行判断;

3.(A[Head]+A[End])<target, A[Head]就不可能是满足条件的元素,因此,Head = Head + 1,继续进行判断;

按照上面的方法,边界条件是:当Head>=End时,不存在两个元素的和等于给定的值。

这种方法的时间复杂度O(n),空间复杂度为O(1)。

上面的方法的前提是数组是已经排好序的,对于无序的数组进行排序的时间复杂度为O(nlogn),因此,先对输入的数组进行排序,然后使用上面的算法来寻找满足条件的两个元素,时间复杂度为O(nlogn)+O(n)=O(nlogn),这样相对于暴力算法的O(n^2)的时间复杂度,就大大降低了。

虽然上面的算法可以找到满足条件的两个元素,但是,这道题确实要求计算的是元素的坐标,因此,必须先将原来的数组复制一份,然后在复制出来的数组中进行上面的算法,找到元素之后再在原来的数组中寻找坐标的值。

由于数组中可能存在相同的元素,并且满足条件的两个元素是相同的,因此,在找到第一个元素的坐标之后,需要更改第一个元素的值,为了方便起见,可以将第一个元素的值更改为第二个元素减去1,然后再寻找第二个元素的坐标。

三.实现代码

class Solution
{
public:
    vector<int> twoSum(vector<int> &numbers, int target)
    {
        // copy the numbers
        vector<int> TmpNumbers(numbers);
        // sort the tmp number vector
        sort(TmpNumbers.begin(), TmpNumbers.end());
        int Size = TmpNumbers.size();
        int HeadIndex = 0;
        int EndIndex = Size - 1;
        int Start = 0;
        int End = 0;
        int SumOfTwo = 0;
        while(HeadIndex < EndIndex)
        {
            Start = TmpNumbers[HeadIndex];
            End = TmpNumbers[EndIndex];
            SumOfTwo = Start + End;
            if (SumOfTwo == target)
            {
                break;
            }
            if (SumOfTwo > target)
            {
                EndIndex--;
            }
            if (SumOfTwo < target)
            {
                HeadIndex++;
            }
        }
        // find the element
        vector<int>::iterator Ite_1 = find(numbers.begin(), numbers.end(), Start);
        (*Ite_1) = End - 1;
        vector<int>::iterator Ite_2 = find(numbers.begin(), numbers.end(), End);
        // get the index of the element
        int Index_1 = Ite_1 - numbers.begin() + 1;
        int Index_2 = Ite_2 - numbers.begin() + 1;
        if (Index_1 > Index_2)
        {
            int Tmp = Index_1;
            Index_1 = Index_2;
            Index_2 = Tmp;
        }
        vector<int> Result;
        Result.push_back(Index_1);
        Result.push_back(Index_2);
        return Result;
    }
};

四.体会

这道题也是一道利用排序的数组的特性的题,只不过原始的数组是没有排序的,对原始数组进行排序之后,就可以利用排序数组的特性进行计算了。这道题也算是一道比较简单的题目了。

版权所有,欢迎转载,转载请注明出处,谢谢

时间: 2024-10-10 13:08:15

LeetCode_Two Sum的相关文章

LeetCode OJ - Sum Root to Leaf Numbers

这道题也很简单,只要把二叉树按照宽度优先的策略遍历一遍,就可以解决问题,采用递归方法越是简单. 下面是AC代码: 1 /** 2 * Sum Root to Leaf Numbers 3 * 采用递归的方法,宽度遍历 4 */ 5 int result=0; 6 public int sumNumbers(TreeNode root){ 7 8 bFSearch(root,0); 9 return result; 10 } 11 private void bFSearch(TreeNode ro

129. Sum Root to Leaf Numbers

Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number. An example is the root-to-leaf path 1->2->3 which represents the number 123. Find the total sum of all root-to-leaf numbers. For example, 1 / 2 3 T

Leetcode 494 Target Sum 动态规划 背包+滚动数据

这是一道水题,作为没有货的水货楼主如是说. 题意:已知一个数组nums {a1,a2,a3,.....,an}(其中0<ai <=1000(1<=k<=n, n<=20))和一个数S c1a1c2a2c3a3......cnan = S, 其中ci(1<=i<=n)可以在加号和减号之中任选. 求有多少种{c1,c2,c3,...,cn}的排列能使上述等式成立. 例如: 输入:nums is [1, 1, 1, 1, 1], S is 3. 输出 : 5符合要求5种

31.SUM() 函数

SUM() 函数 SUM 函数返回数值列的总数(总额). SQL SUM() 语法 SELECT SUM(column_name) FROM table_name SQL SUM() 实例 我们拥有下面这个 "Orders" 表: O_Id OrderDate OrderPrice Customer 1 2008/12/29 1000 Bush 2 2008/11/23 1600 Carter 3 2008/10/05 700 Bush 4 2008/09/28 300 Bush 5

1305 Pairwise Sum and Divide

基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 有这样一段程序,fun会对整数数组A进行求值,其中Floor表示向下取整: fun(A) sum = 0 for i = 1 to A.length for j = i+1 to A.length sum = sum + Floor((A[i]+A[j])/(A[i]*A[j])) return sum 给出数组A,由你来计算fun(A)的结果.例如:A = {1, 4, 1},fun(A) = [5/4] + [

Java [Leetcode 303]Range Sum Query - Immutable

题目描述: Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive. Example: Given nums = [-2, 0, 3, -5, 2, -1] sumRange(0, 2) -> 1 sumRange(2, 5) -> -1 sumRange(0, 5) -> -3 Note: You may assume that the ar

LeetCode 303. Range Sum Query - Immutable

求数组nums[i,j]的和 思路:另开一sum数组,sum[i]为nums[0,i]的和,所以nums[i,j] = sum[j] - sum[i-1] 1 class NumArray { 2 public: 3 vector<int> sum; 4 NumArray(vector<int> &nums) { 5 sum.resize(nums.size(), 0); 6 sum[0] = nums[0]; 7 int len = nums.size(); 8 for(

【数组】Minimum Path Sum

题目: Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path. Note: You can only move either down or right at any point in time. 思路: 设res[i][j]表示从左上角到grid[i][

HDU 5586 Sum

最大子串和 #include<cstdio> #include<cstring> const int maxn=100000+10; int n; int x[maxn]; int fx[maxn]; int a[maxn]; int sum[maxn]; int L[maxn],R[maxn]; const int INF=0x7FFFFFFF; int max(int a,int b) { if(a>b) return a; return b; } int main()