leetcode(리트코드)494-Target Sum
leetcode(리트코드)494-Target Sum
leetcode 494 - Target Sum 문제입니다.
1. 문제
https://leetcode.com/problems/target-sum/
2. Input , Output
3. 분류 및 난이도
Medium 난이도 문제입니다.
leetcode Top 100 Liked 문제입니다.
4. 문제 해석
- 일반 벡터와 target이 주어집니다.
- 벡터의 요소들을 덧셈과 뺄셈을이용하여 target을 만들 수 있는 경우의 수를 리턴합니다.
5. code
c++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
void DFS(vector<int>& nums,int target,int curr,int index,int& result){
if(index == nums.size()){
if(curr == target)
++result;
return ;
}
DFS(nums,target,curr-nums[index],index+1,result);
DFS(nums,target,curr + nums[index],index+1,result);
}
int findTargetSumWays(vector<int>& nums, int target) {
//DFS
int result = 0 ;
DFS(nums,target,0,0,result);
return result;
}
};
6. 결과 및 후기, 개선점
c++ 17% 1144ms
개선한 코드 4ms c++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Solution {
public:
typedef long long ll;
int findTargetSumWays(vector<int>& a, int target) {
ll i,j,sum=0,n=a.size();
for(i=0;i<n;i++){
//요소를 일단 다 더한다.
sum+=a[i];
}
//target을 만들 수 없는 경우
if(target>sum)
return 0;
//왠지 모르게 안되는 겅우?
sum = (sum+target);
if(sum%2!=0)
return 0;
//knap dp방법.
ll k = (sum)/2;
ll dp[n+1][k+1];
memset(dp, 0, sizeof(dp));
for(i=0;i<=n;i++){
dp[i][0]=1;
}
for(i=1;i<=n;i++){
for(j=0;j<=k;j++){
if(a[i-1]<=j){
dp[i][j]=dp[i-1][j] + dp[i-1][j-a[i-1]];
}else{
dp[i][j]=dp[i-1][j];
}
}
}
return dp[n][k];
}
};
This post is licensed under CC BY 4.0 by the author.