生活随笔
收集整理的這篇文章主要介紹了
小米面试:目标和
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:
給定一個非負整數數組,a1, a2, ..., an, 和一個目標數,S。現在你有兩個符號?+?和?-。對于數組中的任意一個整數,你都可以從?+?或?-中選擇一個符號添加在前面。
返回可以使最終數組和為目標數 S 的所有添加符號的方法數。
示例:
輸入:nums: [1, 1, 1, 1, 1], S: 3
輸出:5
解釋:
-1+1+1+1+1 = 3
+1-1+1+1+1 = 3
+1+1-1+1+1 = 3
+1+1+1-1+1 = 3
+1+1+1+1-1 = 3
一共有5種方法讓最終目標和為3。
?
提示:
數組非空,且長度不會超過 20 。
初始的數組的和不會超過 1000 。
保證返回的最終結果能被 32 位整數存下。
//dp[i][j] 表示數組前i個數組合和為j的方法數
public class Solution {public int findTargetSumWays(int[] nums, int S) {//占用空間較大時需要申請堆內存int[][] dp = new int[nums.length][2001];//加1000 防止下標為負數dp[0][nums[0] + 1000] = 1;dp[0][-nums[0] + 1000] += 1;for (int i = 1; i < nums.length; i++) {for (int sum = -1000; sum <= 1000; sum++) {//去除對應的0種可能數if (dp[i - 1][sum + 1000] > 0) {//動態規劃是一層層算dp[i][sum + nums[i] + 1000] += dp[i - 1][sum + 1000];dp[i][sum - nums[i] + 1000] += dp[i - 1][sum + 1000];}}}return S > 1000 ? 0 : dp[nums.length - 1][S + 1000];}
}
要求和為S的對應的方法數,先求0~S-1 和對應的方法數
?
參考地址:https://leetcode-cn.com/problems/target-sum/solution/mu-biao-he-by-leetcode/
總結
以上是生活随笔為你收集整理的小米面试:目标和的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。