为什么80%的码农都做不了架构师?>>>   

问题:

You are given a list of non-negative integers, a1, a2, ..., an, and a target, S. Now you have 2 symbols + and -. For each integer, you should choose one from + and - as its new symbol.

Find out how many ways to assign symbols to make sum of integers equal to target S.

Example 1:

Input: nums is [1, 1, 1, 1, 1], S is 3.
Output: 5
Explanation:
-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
There are 5 ways to assign symbols to make the sum of nums be target 3.

Note:

  1. The length of the given array is positive and will not exceed 20.
  2. The sum of elements in the given array will not exceed 1000.
  3. Your output answer is guaranteed to be fitted in a 32-bit integer.

解决:

①  dfs。时间复杂度O(2^n)。

class Solution { //706ms
    int count = 0;
    public int findTargetSumWays(int[] nums, int S) {
        if (nums == null || nums.length == 0) return 0;
        dfs(nums,S,0,0);
        return count;
    }
    public void dfs(int[] nums,int s,int i,int sum){
        if (i == nums.length){
            if (s == sum){
                count ++;
            }
            return;
        }
        dfs(nums,s,i + 1,sum + nums[i]);
        dfs(nums,s,i + 1,sum - nums[i]);
    }
}

② 递归解决方案非常慢,因为它的运行时间是指数的。

原问题等价于:找到一个正数的子集,其余为负数,其总和为target。

设P为正数子集,N为负数子集。例如:

给定nums = [1,2,3,4,5]和target = 3,那么一个可能的解决方案是+ 1 - 2 + 3 - 4 + 5 = 3。

此时正子集是P = [1,3,5],负子集是N = [2,4]。

下面将其转换为子集总和问题:

                  sum(P) - sum(N) = target
sum(P) + sum(N) + sum(P) - sum(N) = target + sum(P) + sum(N)2 * sum(P) = target + sum(nums)

所以原来的问题已被转换为子集和问题如下:
找出nums的一个子集P,使得sum(P)=(target + sum(nums))/ 2

class Solution { //17ms
    public int findTargetSumWays(int[] nums, int S) {
        int sum = 0;
        for (int i = 0;i < nums.length;i ++){
            sum += nums[i];
        }
        if (S > sum || (sum + S) % 2 == 1) return 0;//只有该式为偶数时才有符合条件的解
        return subsetSum(nums,(sum + S) / 2);
    }
    public int subsetSum(int[] nums,int S){
        int[] dp = new int[S + 1];
        dp[0] = 1;//初始记录0的位置为1
        for (int i = 0;i < nums.length;i ++){
            for (int j = S;j >= nums[i];j --){
                dp[j] += dp[j - nums[i]];
            }
        }
        return dp[S];
    }
}

转载于:https://my.oschina.net/liyurong/blog/1603737

加/减数组中的值得到指定的和 Target Sum相关推荐

  1. python使用numpy的np.float_power函数计算numpy数组中每个数值的指定幂次(例如平方、立方)、np.power函数默认返回整数格式、np.float_power函数返回浮点数

    python使用numpy的np.float_power函数计算numpy数组中每个数值的指定幂次(例如平方.立方).np.power函数默认返回整数格式.np.float_power函数默认返回浮点 ...

  2. python使用numpy的np.power函数计算numpy数组中每个数值的指定幂次(例如平方、立方)、np.power函数默认返回整数格式、np.float_power函数默认返回浮点数

    python使用numpy的np.power函数计算numpy数组中每个数值的指定幂次(例如平方.立方).np.power函数默认返回整数格式.np.float_power函数默认返回浮点数 目录

  3. 将一个数组中的字符串用指定字符分割开,分别放到另一个数组中

    #include "stdafx.h" #include <stdio.h> #include <string.h> #pragma warning(dis ...

  4. Leetcode 给定一个数组,给定一个数字。返回数组中可以相加得到指定数字的两个索引

    问题内容是:给定一个数组,给定一个数字.返回数组中可以相加得到指定数字的两个索引. 比如:给定nums = [2, 7, 11, 15], target = 9 那么要返回 [0, 1],因为2 + ...

  5. 关于等价无穷小在加减运算中的应用

    关于等价无穷小在加减运算中的应用 1 初体验 为什么可以加减中运用等价无穷小? 例如: 例 1 limx→02sinx−ex+1xlim_{x \to 0} \frac{2sinx-e^x+1}{x} ...

  6. mysql 字段加减_MySQL中你必须了解的函数

    在学习MySQL的时候你会发现,它有非常多的函数,在学习的时候没有侧重.小编刚开始学习的时候也会有这个感觉.不过,经过一段时间的学习之后,小编发现尽管函数有很多,但是常用的却只有那几个.今天小编就把常 ...

  7. MongoDB 学习笔记之 从数组中删除元素和指定数组位置

    从数组中删除元素: 从数组中删除单个元素: db.ArrayTest.updateOne({ "name" : "Bill"},{$pop: {"ad ...

  8. 浮点加减运算中关于结果规格化的思考

    对于两个浮点数x和y满足: 完成x与y的加减法有四个步骤: 0操作数检查.即检查是否有一个操作数为0,是的话直接得到结果,一般在计算机中不进行这一步. 比较阶码大小并完成对阶.要让两个浮点数的尾数能够 ...

  9. python集合的加减_python 中对list做减法操作

    问题描述:假设我有这样两个list, 一个是list1,list1 = [1, 2, 3, 4, 5] 一个是list2,list2 = [1, 4, 5] 我们如何得到一个新的list,list3, ...

最新文章

  1. oracle 批量导出sequence,Oracle中批量導出Sequence
  2. windows下载anaconda3速度太慢怎么办
  3. explain都不懂,还好意思说会SQL调优?
  4. 导入之后再执行一个方法_种花生再撒点儿石灰,掌握这两个方法之后,提高产量基本没问题!...
  5. 内存或磁盘空间不足,Microsoft Office Excel 无法再次打开或保存任何文档。 [问题点数:20分,结帖人wenyang2004]...
  6. iOS 正确选择图片加载方式
  7. 【病灶分类】基于matlab粒子群算法优化SVM病灶分类【含Matlab源码 1520期】
  8. 黑马vue实战项目-(七)订单管理页面的开发
  9. PH值检测C语言程序,食品中pH的检测
  10. Rust:Match语句详解
  11. Centos6.x安装mysql5.6版本
  12. 骗子QQ微信在线查询系统网站源码
  13. Unity网络编程教学视频(本人第一次录制)
  14. 数据分析常见的英文缩写(一)
  15. matlab set函数
  16. 启动mysql 数据库服务器_启动及关闭MySQL服务器的正确方式
  17. VS Code配置C/C++环境
  18. 牛顿法与牛顿下山法(切线法)
  19. 转 大数据量下载解决方案
  20. 华为magic book笔记本无法重装系统的麻烦

热门文章

  1. Discuz!X论坛开发(九)二次开发之Discuz X2 文件目录功能详解
  2. 移植uboot第十步:制作uboot补丁
  3. iphone双卡_不吹不黑,今年的四款iPhone到底谁最值得买?
  4. 基于NopCommerce的开源电商系统改造总结
  5. shiro学习总结(一)----初识shiro
  6. C++ 之虚函数的实现原理
  7. hbase 研究 :LoadIncrementalHFiles/HFileOutputFormat2 cannot be resolved
  8. 第十章—DOM(0)—NODE类型
  9. jquery 悬浮验证框架 jQuery Validation Engine
  10. 如何快速重置打印队列