LeetCode 1658. 将 x 减到 0 的最小操作数(哈希)

文章目录

1. 题目

给你一个整数数组 nums 和一个整数 x 。每一次操作时,你应当移除数组 nums 最左边或最右边的元素,然后从 x 中减去该元素的值。请注意,需要 修改 数组以供接下来的操作使用。

如果可以将 x 恰好 减到 0 ,返回 最小操作数 ;否则,返回 -1 。

示例 1:
输入:nums = [1,1,4,2,3], x = 5
输出:2
解释:最佳解决方案是移除后两个元素,将 x 减到 0 。

示例 2:
输入:nums = [5,6,7,8,9], x = 4
输出:-1

示例 3:
输入:nums = [3,2,20,1,1,3], x = 10
输出:5
解释:最佳解决方案是移除后三个元素和前两个元素(总共 5 次操作),将 x 减到 0 。
 
提示:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^4
1 <= x <= 10^9

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-operations-to-reduce-x-to-zero
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 哈希记录前缀和及其长度
  • 遍历后缀和 tailsum,在前缀和中查找 x-tailsum
class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int n = nums.size(), sum = 0;
        unordered_map<int,int> presum;
        presum[0] = 0;//前缀和为0时,长度为0
        for(int i = 0; i < n; i++) 
        {
            sum += nums[i];
            presum[sum] = i+1;//前缀和对应的长度
        }
        int tailsum = 0, minlen = INT_MAX;
        if(presum.find(x) != presum.end())
            minlen = presum[x];
        for(int i = n-1; i >= 0; i--)
        {
            tailsum += nums[i];
            int target = x - tailsum;
            if(presum.find(target) != presum.end() && presum[target] < i)
            {
                minlen = min(minlen, presum[target]+n-i);
            }
        }
        return minlen==INT_MAX ? -1 : minlen;
    }
};

1088 ms 164.7 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

已标记关键词 清除标记
以改变单词中的一个字母,同时,新产生的单词必须是在给定的单词集合Dict中。求所有行得通步数最少的修改方法。 举个例子如下: Given: A = "hit" B = "cog" Dict = ["hot","dot","dog","lot","log"] Return [ ["hit","hot","dot","dog","cog"], ["hit","hot","lot","log","cog"] ] 即把字符串A = "hit"转变成字符串B = "cog",有以下两种可能: "hit" -> "hot" -> "dot" -> "dog" -> "cog"; "hit" -> "hot" -> "lot" -> "log" ->"cog"。 答题说明: A和B相同的情况下不需要做转换,此时直接返回空集; main函数是为方便你在提交代码之前进行在线编译测试,可不完成。 import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.TreeSet; import java.util.Vector; import java.util.Collections; import java.util.Comparator; public class Solution { class TreeNode{ String src; Vector<String> passNodes; HashSet<String> passNodeSrcs; public TreeNode(String src, TreeNode parent){ this.src = src; passNodes = new Vector<String>(); if(parent != null){ passNodes.addAll(parent.passNodes); } passNodes.add(src); passNodeSrcs = new HashSet<String>(); if(parent != null){ passNodeSrcs.addAll(parent.passNodeSrcs); } passNodeSrcs.add(src); } public boolean equals(String src){ return this.src.equals(src); } } public boolean isOneDiff(String src, String dest){ int diffCount = 0; for(int i = 0; i < src.length(); i++){ if(src.charAt(i) != dest.charAt(i)){ diffCount++; if(diffCount > 1){ return false; } } } return diffCount == 1; } public void buildTree(TreeNode node, String end, Set<String> dict, Vector<Vector<String>> results){ if(isOneDiff(node.src, end)){ node.passNodes.add(end); results.add(node.passNodes); return; } for(String d : dict){ if(node.passNodeSrcs.contains(d)){ continue; } if(!isOneDiff(node.src, d)){ continue; } TreeNode child = new TreeNode(d, node); buildTree(child, end, dict, results); } } public Vector<Vector<String>> findLadders(String start, String end, Set<String> dict) { Vector<Vector<String>> results = new Vector<Vector<String>>(); // 相同不转换 if(start.equals(end)){ return results; } // 建树计算 TreeNode node = new TreeNode(start, null); buildTree(node, end, dict, results); // 取最短的 int min = dict.size() + 2; for(Vector<String> result : results){ if(result.size() < min){ min = result.size(); } } Vector<Vector<String>> resultAll = new Vector<Vector<String>>(); for(Vector<String> result : results){ if(result.size() == min){ resultAll.add(result); } } return resultAll; } public static void main(String[] args) { String start = "hit"; String end = "cog"; Set<String> dict = new HashSet<String>(); dict.add("hot"); dict.add("dot"); dict.add("dot"); dict.add("dog"); dict.add("lot"); dict.add("log"); Vector<Vector<String>> results = new Solution().findLadders(start,end,dict); for(Vector<String> vect : results){ System.out.println(vect); } } }
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页