[알고리즘-LeetCode] Two Sum
Updated:
Two Sum
Problem
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:
iven nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
1.Solution
원래 가장 첫번째 풀었던 방법은 O(n2)방식으로 단순하게 이중for문으로 풀었습니다.
이 방법은 구현하기엔 간단하지만 시간복잡도가 높아져 별로 좋지못한 방법입니다.
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TwoSum {
public static void main(String[] args) {
// int[] nums = {2,11,15,7};
// int[] nums = {-3,4,3,90};
int[] nums = {-3,4,3,90};
int target = 0;
int[] result = twoSum(nums, target);
System.out.println(result[0] +","+ result[1]);
}
private static int[] twoSum(int[] nums, int target) {
int len = nums.length;
int[] result = new int[2];
for(int i=0; i<len-1; i++){
for(int j=i+1; j<len ;j++){
if(nums[i]+nums[j] == target) {
result[0]=i;
result[1]=j;
return result;
}
}
}
return null;
}
}
2.Solution
두번째 솔루션은 위에 java와는 다르게 c++로 풀어보았습니다. 사실 LeetCode에 나와있는 답을 보고 풀었는데 정말 좋은 아이디어인것 같습니다. map을 활용해서 O(n)만에 for문 한번으로 끝내는 방법입니다.
#include <iostream>
#include <vector>
#include <map>
using namespace std;
class Solution{
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> res;
map<int, int> m;
for(int i=0; i< nums.size(); i++){
int val = target - nums[i];
if(m.count(val)>0){
res.push_back(m[val]);
res.push_back(i);
return res;
}
m.insert(pair<int, int>(nums[i], i));
}
return nums;
}
};
int main()
{
Solution s;
vector<int> nums, res;
int target = 9;
nums.push_back(2);
nums.push_back(7);
nums.push_back(11);
nums.push_back(15);
res = s.twoSum(nums, target);
for(int i=0; i<res.size(); i++){
cout << res[i] << endl;
}
return 0;
}
Leave a comment