LeetCode面の質問17.16。マッサージ師

私の質問LeetCodeブラシソース[GitHubの]:https://github.com/izhoujie/Algorithmcii

LeetCode面の質問17.16。マッサージ師

タイトル

既知のマッサージセラピストは、予約要求の安定したストリームを受信する、予約は、各接続又は未接続のために選択することができます。彼女は隣の予定を受け入れることができなかったので、各予約サービスの間、休息する時間を持っています。予約要求、最適なセット(最長総予約)を見つけるためにマッサージセラピストの予約の順序を考えると、数分の合計数を返します。

注:この問題は、元のタイトルに比較的小さな変更であります

例1:

输入: [1,2,3,1]
输出: 4
解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。

例2:

输入: [2,7,9,3,1]
输出: 12
解释: 选择 1 号预约、 3 号预约和 5 号预约,总时长 = 2 + 9 + 1 = 12。

例3:

输入: [2,1,4,5,3,1,1,3]
输出: 12
解释: 选择 1 号预约、 3 号预约、 5 号预约和 8 号预约,总时长 = 2 + 4 + 3 + 3 = 12。

出典:滞在ボタン(LeetCode)
リンクhttps://leetcode-cn.com/problems/the-masseuse-lcci
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。

問題解決のためのアイデア

動的プログラミングの1-DPのアイデア;

等しい長NUMSアレイDP、DPの[i]を作成1-するi番目つかむことができ、カットオフの最大値を示し、
前の3 NUMS 0,1,2の最初のために、単純な分析。

  • DP [0] = NUM​​S [0]、すなわち、最初の現在の最良のグラブ。
  • DP [1] = Math.max(DP [0]、NUMS [1])、すなわち、第一又は第二の電流グラブベスト。
  • DP [2] = Math.max(DP [2-1]、DP [2-2] + NUMS [2])、すなわち直接離れDP [1]の結果、または検討[0] DP取り、なおNUMS [2]、後者が最大である場合、
  • 利用可能な誘導一般式DP:DP [I] = Math.max(DP [I-1]、DP [I-2] + NUMS [I])。

DPの動的な計画が伝達方程式を得るために、質問の意味の慎重な分析が必要

アイデアアイデア2- 1、前者と現在の結果の結果と考え時間、アレイは、2つの変数の値に対して最適化することができるDP。

1つのDP用:[I] = Math.max (DP [I-1]、DP [I-2] + NUMS [I])
のために最適化
- tempMax Math.max =(最大、CURR NUMS + [I ])
- CURR =最大値
-最大値= tempMax

キーは、動的プログラミング遷移方程式を見つけることであるが、いくつかのケースでは、DP配列反復であることがいくつかの変数を最適化することができ、安価なメモリ

アルゴリズムのソースコードの例

package leetcode;

/**
 * @author ZhouJie
 * @date 2020年3月24日 下午7:49:36 
 * @Description: 面试题 17.16. 按摩师
 *
 */
public class LeetCode_Satine_17_16 {

}

class Solution_17_16 {
	/**
	 * @author: ZhouJie
	 * @date: 2020年3月24日 下午8:41:37 
	 * @param: @param nums
	 * @param: @return
	 * @return: int
	 * @Description: 1-dp动态规划;
	 *
	 */
	public int massage_1(int[] nums) {
		int len = 0;
		if (nums == null || (len = nums.length) == 0) {
			return 0;
		}
		if (len == 1) {
			return nums[0];
		}
		int[] dp = new int[len];
		dp[0] = nums[0];
		dp[1] = Math.max(nums[0], nums[1]);
		for (int i = 2; i < len; i++) {
			dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);
		}
		return dp[len - 1];
	}

	/**
	 * @author: ZhouJie
	 * @date: 2020年3月24日 下午8:41:54 
	 * @param: @param nums
	 * @param: @return
	 * @return: int
	 * @Description: 2-动态规划优化掉数组;
	 *
	 */
	public int massage_2(int[] nums) {
		if (nums == null || nums.length == 0) {
			return 0;
		}
		int max = 0, curr = 0;
		for (int i : nums) {
			int temp = Math.max(max, curr + i);
			curr = max;
			max = temp;
		}
		return max;
	}
}

おすすめ

転載: www.cnblogs.com/izhoujie/p/12562291.html