博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
目标和
阅读量:4187 次
发布时间:2019-05-26

本文共 1956 字,大约阅读时间需要 6 分钟。

给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意

一个整数,你都可以从 + 或 -中选择一个符号添加在前面。

返回可以使最终数组和为目标数 S 的所有添加符号的方法数。

1、常规思路 

对于数组中的每一个数,它的符号只有两种选择,一种是取正,一种是取负,根据这两种策略,计算结果。

int ncount = 0;	public void solve(int idx, int[] nums, int S)	{//		if (S < 0) // 这个边界条件不合适,它会影响结果//			return;		if (idx == nums.length && S == 0) // 找到了一个解		{			ncount++;			return;		}				if (idx == nums.length) 			return;				solve(idx+1, nums, S-nums[idx]); // nums[idx]符号为正		solve(idx+1, nums, S+nums[idx]); // nums[idx]符号为负	}	    public int findTargetSumWays(int[] nums, int S)     {    	solve(0, nums, S);    	return ncount;    }

2、记忆化搜索

public int solve(int idx, int[] nums, int S, Map
map) { // 避免数字重复,无法找到截断点 String encodeString = idx + "->" + S; if (map.containsKey(encodeString)) return map.get(encodeString); if (idx == nums.length) { return S == 0 ? 1 : 0; // S==0找到一个解 } int curNum = nums[idx]; int positive = solve(idx+1, nums, S-nums[idx], map); int negitive = solve(idx+1, nums, S+nums[idx], map); map.put(encodeString, positive+negitive); return positive + negitive; } public int findTargetSumWays(int[] nums, int S) { HashMap
hashMap = new HashMap
(); if (nums == null || nums.length == 0) return 0; return solve(0, nums, S, hashMap); }

3、动态规划

public int findTargetSumWays(int[] nums, int S)     {    	int sum = 0;    	if (nums == null || nums.length == 0)    		return 0;    	    	// 计算数组中元素之和    	for (int i = 0; i < nums.length; i++)    		sum += nums[i];    	if (S > sum || (sum + S) % 2 == 1)    		return 0;    	return solve(nums, (sum+S)/2);    }        int solve(int[] nums, int S)	{    	int[] dp = new int[S+1]; // 状态矩阵    	dp[0] = 1;     	/*    	 递归式    	solve(idx+1, nums, S-nums[idx]); // nums[idx]符号为正		solve(idx+1, nums, S+nums[idx]); // nums[idx]符号为负		*/    	for (int i=0; i
=nums[i]; j--) { dp[j] += dp[j-nums[i]]; } } return dp[S]; }

 

转载地址:http://kcpoi.baihongyu.com/

你可能感兴趣的文章
《给初学者的Windows Vista的补遗手册》之057
查看>>
《给初学者的Windows Vista的补遗手册》之056
查看>>
《给初学者的Windows Vista的补遗手册》之045
查看>>
域名1元价,我也来注册一个
查看>>
《给初学者的Windows Vista的补遗手册》之037
查看>>
《给初学者的Windows Vista的补遗手册》之036
查看>>
《给初学者的Windows Vista的补遗手册》之035
查看>>
Spring开发指南 0.8 发布
查看>>
微软宣布将推出XNA Game Studio
查看>>
MySQL宣布加入微软Visual Studio工业伙伴计划
查看>>
菜鸟、夫子、玫林凯与测试
查看>>
无锁编程与分布式编程那个更适合多核CPU?
查看>>
多核系统中三种典型锁竞争的加速比分析
查看>>
多核新观念-象使用内存一样使用CPU?
查看>>
OpenMP创建线程中的锁及原子操作性能比较
查看>>
多核编程中的任务随机竞争模式的概率分析
查看>>
多核编程中的任务分组竞争模式
查看>>
模块分解原理与三权分立
查看>>
模块分解原理的探索
查看>>
90%程序员写不出无BUG的二分查找程序?
查看>>