2021-05-07:给定一个数组arr,你可以在每个数字之前决定+或者-,但是必须所有数字都参与 ,再给定一个数target,请问最后算出target的方法数是多少?

福大大 答案2021-05-07:

优化点一 :
你可以认为arr中都是非负数
因为即便是arr中有负数,比如[3,-4,2]
因为你能在每个数前面用+或者-号
所以[3,-4,2]其实和[3,4,2]达成一样的效果
那么我们就全把arr变成非负数,不会影响结果的
优化点二 :
如果arr都是非负数,并且所有数的累加和是sum
那么如果target<sum,很明显没有任何方法可以达到target,可以直接返回0
优化点三 :
因为题目要求一定要使用所有数字去拼target,
所以不管这些数字怎么用+和-折腾,最终的结果都一定不会改变奇偶性
所以,如果所有数的累加和是sum,
并且与target的奇偶性不一样,没有任何方法可以达到target,可以直接返回0
优化点四 :
比如说给定一个数组, arr = [1, 2, 3, 4, 5] 并且 target = 3
其中一个方案是 : +1 -2 +3 -4 +5 = 3
该方案中取了正的集合为P = {1,3,5}
该方案中取了负的集合为N = {2,4}
所以任何一种方案,都一定有 sum§ - sum(N) = target
现在我们来处理一下这个等式,把左右两边都加上sum§ + sum(N),那么就会变成如下:
sum§ - sum(N) + sum§ + sum(N) = target + sum§ + sum(N)
2 * sum§ = target + 数组所有数的累加和
sum§ = (target + 数组所有数的累加和) / 2
也就是说,任何一个集合,只要累加和是(target + 数组所有数的累加和) / 2
那么就一定对应一种target的方式
也就是说,比如非负数组arr,target = 7, 而所有数累加和是11
求使用所有数字的情况下,多少方法最后形成7?
其实就是求有多少个子集的累加和是9 -> (7 + 11) / 2
优化点五 :
二维动态规划的空间压缩技巧

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
arr := []int{1, 1, 1, 1, 1}
target := 3
ret := findTargetSumWays3(arr, target)
fmt.Println(ret)
} func findTargetSumWays3(arr []int, target int) int {
sum := 0
for _, n := range arr {
sum += n
}
return twoSelectOne(sum < target || ((target&1)^(sum&1)) != 0, 0, subset(arr, (target+sum)>>1))
} func subset(nums []int, s int) int {
dp := make([]int, s+1)
dp[0] = 1
for _, n := range nums {
for i := s; i >= n; i-- {
dp[i] += dp[i-n]
}
}
return dp[s]
} func twoSelectOne(condition bool, a int, b int) int {
if condition {
return a
} else {
return b
}
}

执行结果如下:


左神java代码

2021-05-07:给定一个数组arr,你可以在每个数字之前决定+或者-,但是必须所有数字都参与 ,再给定一个数target,请问最后算出target的方法数是多少?的更多相关文章

  1. 算法题——给定一个数组 arr,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

    参考自:https://blog.csdn.net/qq_38200548/article/details/80688630 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] ...

  2. [java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.

    给定一个数组,求和为定值的所有组合, 这道算法题在leetcode应该算是中等偏下难度, 对三到五年工作经验主要做业务开发的同学来说, 一般较难的也就是这种程度了. 简述经过: 不算hr面,总计四面, ...

  3. 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票. 示例 ...

  4. 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度为O(N),且要求不能用非基于比较的排序

    题目: 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度为O(N),且要求不能用非基于比较的排序 public static int maxGap(int nums[]) { if ( ...

  5. 【IT笔试面试题整理】给定一个数组a[N]构造数组b [N]

    [来源]:腾讯2013实习生笔试   给定一个数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]-a[N-1] / a[j])空间复杂度和O(n)的时间复杂度:除遍历计数器与a ...

  6. 刷题3:给定一个数组 nums,判断 nums 中是否存在三个下标 a,b,c数相加等于targe且a,b,c不相等

    题目: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,下标 ,a ,b , c 对应数相加等于 targe 找出所有满足条件且不重复的三元组下标 解析: ...

  7. 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

    示例 1: 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1 ...

  8. 给定一个数组,求如果排序后,相邻两个元素的最大差值,要求时间复杂度为O(N)

    第一种方法: 计数排序后,然后找出两两之间的最大差值 计数排序的时间复杂度是O(N) public class CountSort { public static void main(String[] ...

  9. 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。

    // test14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  10. python小练习: 给定一个数组 按重复次数 降序排列输出 数组非空且为正整数

    假设有个列表  a=[1,1,1,2,2,4,5,5,5,5] (非空且为正整数) 那么根据要求 最终输出的形式为  5,1,2,4  (按重复次数 降序排列输出) 代码实现及解释: a=[1,1,1 ...

随机推荐

  1. element表格数据v-for替换期望文字

    后端返回等级编码 "1","2"....并给你一个字典obj[ {dicCode: "4", dictFlag: "riskLev ...

  2. Promise静态方法实现(all race finally resolve reject)

    示例 // Promise.resolve() Promise.resolve(1).then((data) => { console.log(data) // 1 }) // Promise. ...

  3. 什么是5G垂直行业?

    什么是垂直行业呢? 感觉"垂直行业"这个词在太多地方遇到,但是这个词的涵盖范围到底是什么呢? 垂直这一概念源于两条直线(或平面)的直角交叉,两条直线是相互作为参照物的.比如,我们可 ...

  4. Lucene搜索引擎-搜索

    Lucene搜索引擎-搜索 常用的Query: BooleanQuery:多个条件组合查询,注意 new BooleanQuery().add(Query, BooleanClause.Occur); ...

  5. Python实现方便的读入数字

    众所周知,python只能读字符串,你如果要读整数只能读一个字符串,split成列表,再用int或者float转换. 比如这样 s=input().split() a,b=map(int,s) #或者 ...

  6. 使用float进行比较问题处理

    float compare Abstract 使用float数据进行精确计算和比较,可能由于精度问题导致程序逻辑异常. Explanation 使用float数据进行比较,计算机表达double和fl ...

  7. Hash 表

    更多内容,前往 IT-BLOG 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快 ...

  8. CSAPP-Shell Lab

    提供的工具: parseline:获取参数列表char **argv,返回是否为后台运行命令(true). clearjob:清除job结构. initjobs:初始化jobs链表. maxjid:返 ...

  9. 【深入浅出 Yarn 架构与实现】5-2 Yarn 三种调度器

    本篇文章将深入介绍 Yarn 三种调度器.Yarn 本身作为资源管理和调度服务,其中的资源调度模块更是重中之重.下面将介绍 Yarn 中实现的调度器功能,以及内部执行逻辑. 一.简介 Yarn 最主要 ...

  10. Spring(Ioc和Bean的作用域)

    Spring Spring为简化开发而生,让程序员只关心核心业务的实现,尽可能的不在关注非业务逻辑代码(事务控制,安全日志等). 1,Spring八大模块 这八大模块组成了Spring 1.1 Spr ...