[Leetcode] 1658. Minimum Operations to Reduce X to Zero


https://leetcode.com/problems/minimum-operations-to-reduce-x-to-zero/submissions/
入力:整数配列nums、整数x
出力:配列の開始値と終了値をxから減算し、配列から値を削除する動作を続け、xをゼロの最小数にします.
問題の核心思想は探す目標を変えることだ.これはx値ではなく、配列全体でxを減算する値を探します.

上の図が並んでいると思ったら、青に塗った部分が私たちが探しているx値です.しかし,x値を直接探すのではなく,配列全体でx値を減算した図の白い部分Targetを探す.배열의 총 합 = Target + xなので、目標値の位置が分かればxを満たす値があるかどうかを知ることができます.
ターゲットを検索する方法は、0から最後のインデックスまで、現在のインデックスとを保存します.また,これまで,和からターゲットの値を減算して格納されていた資料構造が存在すると,条件を満たす.
コード#コード#
class Solution {
    public int minOperations(int[] nums, int x) {
        if (nums.length == 0)
   		return 0;

	int total = 0;
	for (int i : nums) {
		total += i;
	}
	int target = total - x;
	Map<Integer, Integer> map = new HashMap<Integer, Integer>();
	int sum = 0;
	int minResult = Integer.MAX_VALUE;
	map.put(0, -1);
	
	for (int i = 0; i < nums.length; i++) {
		sum += nums[i];

		if(i == nums.length-1)
			map.put(sum, i);	
            
		if (map.containsKey(sum - target)) {
			int result = (map.get(sum - target) + 1) + (nums.length - 1 - i);
			minResult = Math.min(minResult, result);
		}

		map.put(sum, i);
	}

	return minResult == Integer.MAX_VALUE ? -1 : minResult;
    }
}
参考説明
https://leetcode.com/problems/minimum-operations-to-reduce-x-to-zero/discuss/935935/Java-Detailed-Explanation-O(N)-Prefix-SumMap-Longest-Target-Sub-Array