LeetCode 通关攻略(非最优解)1 Two Sum

Posted 花开院

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 通关攻略(非最优解)1 Two Sum相关的知识,希望对你有一定的参考价值。

问题描述


Given an array of integers, return indices of the two numbers such that they add up to a specific target.

说是给一个integer数组nums,并给一个integer的值target,让返回数组中两个元素相加等于target的索引对。

未通过的方法


我看此题的的等级是Easy,想都没想直接就来了个for嵌套,如下:

 1 class Solution {
 2 public:
 3     vector<int> twoSum(vector<int>& nums, int target) {
 4         std::vector<int> tempIndex;
 5         for(int i = 0; i != nums.size(); i++)
 6         {
 7             for(int j = 0; j != nums.size(); j++)
 8             {
 9                 if(((nums[i] + nums[j]) == target) && i != j)
10                 {
11                     tempIndex.push_back(i);
12                     tempIndex.push_back(j);
13                     
14                     return tempIndex;
15                 }
16             }
17         }
18         
19         return tempIndex;
20     }
21 };

 

可想而知,overtime,系统容忍不了O(N2)的复杂度。那就只能是想办法来降复杂度了,因此笨人笨方法,我画了个例子来看看有啥规律没(真够笨啊。。。)

image图1

上图1中标有0、1、2、3的框代表数组,其数值代表了索引,而图中的两个数组是一样的,这是为了描述for嵌套方便而已。有向边表示了外层for循环指向内层for循环。而最底下的<x, y>中表示对应的索引对,举例来说就是当外层循环的i = 0时,内层循环的j分别取0、1、2、3时构成的索引对<  >、<0, 1>、<0, 2>、<0, 3>,其中空的<   >表示索引值不能相同。全部写开后可以看出,因为是对同一个数组进行操作,所以<x, y>与<y, x>是一致的,可以完全只取绿色部分即可,因此表现到代码里边也是十分的简单。

通过的方法


只需在内层for循环时跳过重复的索引对,也就是将j = (i + 1)即可,这样整体复杂度是不是降了?

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

 

以上是关于LeetCode 通关攻略(非最优解)1 Two Sum的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode167. Two Sum II - Input array is sorted(双指针)

每日leetcode一题

leetcode每日leetcode一题

leetcode每日leetcode一题

LeetCode通关:连刷十四题,回溯算法完全攻略

LeetCode通关:连刷十四题,回溯算法完全攻略