LeetCode:1_Two_Sum | 两个元素相加等于目标元素 | Medium
题目:
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={, , , }, target=
Output: index1=, index2=
函数原型:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
}
};
解题思路:
1、暴力法:两个for循环遍历,时间复杂度为O(N^2),会超时。
2、排序法:这里有两种思路:
1)排好序后,利用区间法来计算两个数的和(两个指针分别指向首尾,逐步向中间收缩)
2)排好序后,固定一个元素a[i],在余下的数中查找target - a[i],查找可用二分查找法,时间复杂度为O(lgn)。
该种方法的时间复杂度为O(nlgn)。
注意:这种方法由于采用了排序,故每个数的index会改变,所以,必须将每个数和它的index进行关联,我们第一时间想到map,但是map不允许有重复的元素出现,故不合适。进而可以想到结构体,每个数有两个属性:value和index,这样就搞定了。
3、hashtable法:时间复杂度降为O(N)。思想来自排序法的第一种思路,这种方法用到了查找,总所周知,查找最快的方法就是采用hash表。但是前面也说过,hash不能存储重复的元素,比如(0,3,2,0),只存储3个元素,那查找后就无法得到正确答案。这个时候就需要想一种方法来避免这种情况,我们可以这样来做:来一个元素a[i],我们检查它是否在hash表中,不在就插入,然后检查target-a[i]是否在表中,如果在,得到结果。这样就可以得到我们想要的结果,千万不要把所有元素都插入了,再来查找,不然就得不到答案。
代码展示:
排序法:(第一种思路)
//方法一:排序法
struct SNode {
int value;
int pos;
}; bool cmp(SNode a, SNode b)
{
return a.value < b.value;
} vector<int> twoSum(vector<int>& nums, int target) {
int n = nums.size(); vector<int> vecRet;
vector<SNode> vecNode; for (int i=; i < n; i ++) {
SNode temp;
temp.value = nums[i];
temp.pos = i+;
vecNode.push_back(temp);
}
sort(vecNode.begin(),vecNode.end(), cmp); int i = , j = n-;
while(i < j) {
int sum = vecNode[i].value + vecNode[j].value;
if (sum == target) {
if(vecNode[i].pos < vecNode[j].pos){
vecRet.push_back(vecNode[i].pos);
vecRet.push_back(vecNode[j].pos);
break;
}
if (vecNode[i].pos > vecNode[j].pos) {
vecRet.push_back(vecNode[j].pos);
vecRet.push_back(vecNode[i].pos);
break;
}
}
else if (sum > target)
j--;
else
i ++;
}
return vecRet;
}
hashtable法:
//方法二:hashtable法
vector<int> twoSum1(vector<int>& nums, int target)
{
int i, sum;
vector<int> results;
map<int, int> hmap;
for(i=; i<nums.size(); i++){
if(!hmap.count(nums[i])){
hmap.insert(pair<int, int>(nums[i], i));
}
if(hmap.count(target-nums[i])){
int j=hmap[target-nums[i]];
if(j<i){
results.push_back(j+);
results.push_back(i+);
return results;
}
}
}
return results;
}
LeetCode:1_Two_Sum | 两个元素相加等于目标元素 | Medium的更多相关文章
- Java 找到数组中两个元素相加等于指定数的所有组合
思路1:可以用hash表来存储数组中的元素,这样我们取得一个数后,去判断sum - val 在不在数组中,如果在数组中,则找到了一对二元组,它们的和为sum,该算法的缺点就是需要用到一个hash表,增 ...
- java实现 数组中两个元素相加等于指定数的所有组合
package com.algorithm.hash; public class alg1 { public static void main(String argv[]) { int[] arr ...
- [LeetCode] 39. Combination Sum ☆☆☆(数组相加等于指定的数)
https://leetcode.wang/leetCode-39-Combination-Sum.html 描述 Given a set of candidate numbers (candidat ...
- leetcode 415 两个字符串相加
string addstring(string s1,string s2) { string ans=""; ; ,j=s2.length()-;i>=||j>=;i- ...
- 001 Two Sum 两个数的和为目标数字
Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...
- 领扣(LeetCode)两数之和II - 输入有序数组 个人题解
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值 ...
- 刷题3:给定一个数组 nums,判断 nums 中是否存在三个下标 a,b,c数相加等于targe且a,b,c不相等
题目: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,下标 ,a ,b , c 对应数相加等于 targe 找出所有满足条件且不重复的三元组下标 解析: ...
- NlogN复杂度寻找数组中两个数字和等于给定值
算法导论:22页2.3-7 描述一个运行时间为O(nlogn)的算法,找出n个元素的S数组中是否存在两个元素相加等于给定x值 AC解: a=[1,3,6,7,9,15,29] def find2sum ...
- 深入子元素的width与父元素的width关系
深入理解父元素与子元素的width关系 对于这一部分内容,如果理解准确,可以更容易控制布局,节省不必要的代码,这里将简单研究. 第一部分:父子元素都是内联元素 代码演示如下: <!DOCTYPE ...
随机推荐
- JavaScript初见
警告alert() 确认confirm() 提问prompt() 空格 JavaScript-打开新窗口(window.open) open() 方法可以查找一个已经存在或者新建的浏览器窗口. 语法: ...
- yarn 常用命令
1.安装 yarn npm install yarn -g 2.卸载yarn npm uninstall yarn -g
- Vb6调用C#生成的dll
namespace ClassLibrary1 { [ClassInterface(ClassInterfaceType.AutoDispatch)] //注意这行,这行是关键 pub ...
- layer.tips属性
layer.tips(新加的内容,'选择节点',{time: 0, area: ['20%', '20%'], skin: 'layui-layer-rim', tips: [3, '#ffffff' ...
- Acceptance Test - Business Readable Acceptance Test using - Specflow
Agenda Benefits Living document Frameworks specflow supports How to integrate it in development cycl ...
- 跟踪SQL
在数据库中,找到以下页面,并选择事件中的Tsql下的bath...与stm...
- C#写入Oracle 中文乱码问题
这个问题是我刚踏入工作觉得最坑的一个问题,找了很多方法.也问过不少人,但还是没能解决,偶然间返现了新大陆.... 具体问题描述是这样的: 我可以读取Oracle数据库中已有的中文内容,并能正确显示(O ...
- HTTP Status 404 – Not Found
一般都是配置中的问题,这次发现扫描controller时,自己的包是com.aaa.conlller,而springmvc.xml中扫描的是com.aaa.controller,,多写了一个l
- c# 将object尝试转为指定对象
主方法: /// <summary> /// 将object尝试转为指定对象 /// </summary> /// <param name="data" ...
- struct,map,json 互相转换
1.1 struct to json 准备 很简单,使用encoding包可以互相转换,没什么好说的,但是有几点注意: 1.结构体内需要序列化的字段首字母大写(遵循驼峰式命名),不需要序列化的字段小写 ...