首页 > 其他分享 >[leetcode每日一题]1.7

[leetcode每日一题]1.7

时间:2023-01-07 17:32:40浏览次数:52  
标签:1.7 cur val nums i32 每日 min let leetcode

​1658. 将 x 减到 0 的最小操作数​

难度 中等

给你一个整数数组 ​​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 <= 105
  • ​1 <= nums[i] <= 104
  • ​1 <= x <= 109

Solution

我想到的方法是之前周赛的某一个解法,将需要移除的后缀和用哈希表存储,再遍历前缀和进行匹配。

代码(Rust)

impl Solution {
pub fn min_operations(nums: Vec<i32>, x: i32) -> i32 {
use std::collections::HashMap;
let mut right: HashMap<i32, i32> = HashMap::new();
let n = (nums.len()) as i32;
right.insert(0, n);
let mut cur = 0;
for i in (0..n as usize).rev() {
cur += nums[i];
right.insert(cur, i as i32);
}
if cur == x {
return n as i32;
}
else if cur < x {
return -1;
}
let mut min_ = n + 1;
let mut tmp = 0;
if let Some(val) = right.get(&x) {
min_ = if min_ > n - *val {
n - *val
} else {
min_
};
}
for i in 0..n as usize {
tmp += nums[i];
if let Some(val) = right.get(&(x - tmp as i32)) {
min_ = if min_ > n - *val + i as i32 + 1 {
n - *val + i as i32 + 1
} else {
min_
};
}
}
if min_ == n + 1 {
return -1;
}
min_
}
}

但是官方题解用了一个性能更好的滑动窗口来解。学到了。

[leetcode每日一题]1.7_哈希


标签:1.7,cur,val,nums,i32,每日,min,let,leetcode
From: https://blog.51cto.com/u_15763108/5995696

相关文章

  • 2023.1.7 DP 学习日志
    上午编辑距离(AcWing.899)思路:同最短编辑距离,只不过要做\(m\)次。code:#include<bits/stdc++.h>#definelllonglong#defineN1005usingnamespacestd;inlinel......
  • 2023.1.7学习笔记
    、经典类与新式类经典类:​不继承object的类或者其子类的类新式类:​继承object或者其之类的类​在python3中,只有新式类,所有类都默认继承object​在python2中,区......
  • 每日算法之在二叉树中找到两个节点的最近公共祖先
    JZ86在二叉树中找到两个节点的最近公共祖先题目给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值o1和o2,请找到o1和o2的最近公共祖先节点。注:本题保......
  • 【哈希表】LeetCode 299. 猜数字游戏
    题目链接299.猜数字游戏思路建立两个哈希表分别存储secret和guess中不是bulls的数字出现次数。代码classSolution{publicStringgetHint(Stringsecret,......
  • LeetCode 103_ 二叉树的锯齿形层序遍历
    LeetCode103:二叉树的锯齿形层序遍历题目给你二叉树的根节点root,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进......
  • 【哈希表】LeetCode 350. 两个数组的交集 II
    题目链接350.两个数组的交集II思路建立两个哈希表分别统计nums1和nums2中每个数字出现的个数,然后同时遍历两个哈希表,对两个对位元素取其最小值count,将count数......
  • 【哈希表】LeetCode 49. 字母异位词分组
    题目链接49.字母异位词分组思路如果一对字符串是字母异位词,那么他们经过排序之后,应该是相等的。利用这一特点,我们通过哈希表建立排序后字符串到原字符串列表的映射,不......
  • 【删除交换】【哈希表】LeetCode 380. O(1) 时间插入、删除和获取随机元素
    题目链接380.O(1)时间插入、删除和获取随机元素思路下面引用宫水三叶大佬的题解insert操作:使用哈希表判断val是否存在,存在的话返回false,否则将其添加到nums,更......
  • usage of api documented as since 1.7+
    导包无误:importjava.nio.charset.StandardCharsets;导对包之后爆红是因为没有正确配置在projectsetting-->project-->projectsdk[1.8],projectlanguagelevel[8]-......
  • [LeetCode] 2202. Maximize the Topmost Element After K Moves
    Youaregivena 0-indexed integerarray nums representingthecontentsofa pile,where nums[0] isthetopmostelementofthepile.Inonemove,youcan......