LeetCode Two Sum时间复杂度O(n)解法尝试版本1

来源:互联网 发布:2014十大网络用语 编辑:程序博客网 时间:2024/06/03 19:13

题目如下:

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

You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:

Given nums = [2, 7, 11, 15], target = 9,Because nums[0] + nums[1] = 2 + 7 = 9,return [0, 1].

第一版解法尝试

//此版解法忽略了nums中元素值存在小于0 的可能,导致使用了非法下标//即是说此种解法是假设nums中全部元素均是大于0的情况下进行的,知道了这个假设之后可以帮助理解算法思想//思路的核心是将知晓target找下标转化为查看和为target的两数是否存在class Solution {public:    vector<int> twoSum(vector<int>& nums, int target) {        vector<unsigned int> HashTable(target + 1);//+1是为了将target本身也进行判断,因为nums中可能出现一个target与一个0        vector<int> ret(2);        for(unsigned int i = 0; i < nums.size(); i++) //"排序",vector及数组等连续存储的容器下标永恒有序        {            if( nums[i] <= target )//由于未考虑负数的情况,只有小于等于target的两数才有可能相加为target                HashTable[nums[i]] = i;//记录nums[i]的下标        }//由于HashTable的下标是nums中的元素且target是nums中两数和,因此只要HashTable[i]与HashTable[target - i]同时存在,则找到待求        for(unsigned int i = 0; i <= target; i++)        {//特殊情况处理,处理nums[i]与i一致或nums[i]为target-i的情况,比如,nums[0] 为 0且nums[target]为target或 nums[target] 为 0且nums[0]为targe情况            if( i == HashTable[i] && HashTable[target - i] == (target - i) || i == HashTable[target - i] && HashTable[i] == (target - i))            {                ret.push_back(i);                ret.push_back(target - i);break;            }            if( HashTable[i] > 0 && HashTable[target - i] > 0 ) //解决一般性情况            {                ret.push_back(i);                ret.push_back(target - i);break;            }            }        return ret;    }};





阅读全文
0 0
原创粉丝点击