100317. 数组中的峰值
数组 arr
中 大于 前面和后面相邻元素的元素被称为 峰值 元素。
给你一个整数数组 nums
和一个二维整数数组 queries
。
你需要处理以下两种类型的操作:
queries[i] = [1, li, ri]
,求出子数组 nums[li..ri]
中 峰值 元素的数目。queries[i] = [2, indexi, vali]
,将 nums[indexi]
变为 vali
。请你返回一个数组 answer
,它依次包含每一个第一种操作的答案。
注意:
示例 1:
输入:nums = [3,1,4,2,5], queries = [[2,3,4],[1,0,4]]
输出:[0]
解释:
第一个操作:我们将 nums[3]
变为 4 ,nums
变为 [3,1,4,4,5]
。
第二个操作:[3,1,4,4,5]
中峰值元素的数目为 0 。
示例 2:
输入:nums = [4,1,4,2,1,5], queries = [[2,2,4],[1,0,2],[1,0,4]]
输出:[0,1]
解释:
第一个操作:nums[2]
变为 4 ,它已经是 4 了,所以保持不变。
第二个操作:[4,1,4]
中峰值元素的数目为 0 。
第三个操作:第二个 4 是 [4,1,4,2,1]
中的峰值元素。
提示:
3 <= nums.length <= 105
1 <= nums[i] <= 105
1 <= queries.length <= 105
queries[i][0] == 1
或者 queries[i][0] == 2
i
,都有:
queries[i][0] == 1
:0 <= queries[i][1] <= queries[i][2] <= nums.length - 1
queries[i][0] == 2
:0 <= queries[i][1] <= nums.length - 1
, 1 <= queries[i][2] <= 105
原站题解
golang 解法, 执行用时: 335 ms, 内存消耗: 20.6 MB, 提交时间: 2024-06-16 23:20:19
type fenwick []int func (f fenwick) update(i, val int) { for ; i < len(f); i += i & -i { f[i] += val } } func (f fenwick) pre(i int) (res int) { for ; i > 0; i &= i - 1 { res += f[i] } return res } func (f fenwick) query(l, r int) int { if r < l { return 0 } return f.pre(r) - f.pre(l-1) } func countOfPeaks(nums []int, queries [][]int) (ans []int) { n := len(nums) f := make(fenwick, n-1) update := func(i, val int) { if nums[i-1] < nums[i] && nums[i] > nums[i+1] { f.update(i, val) } } for i := 1; i < n-1; i++ { update(i, 1) } for _, q := range queries { if q[0] == 1 { ans = append(ans, f.query(q[1]+1, q[2]-1)) continue } i := q[1] for j := max(i-1, 1); j <= min(i+1, n-2); j++ { update(j, -1) } nums[i] = q[2] for j := max(i-1, 1); j <= min(i+1, n-2); j++ { update(j, 1) } } return }
java 解法, 执行用时: 23 ms, 内存消耗: 135.5 MB, 提交时间: 2024-06-16 23:20:01
class Fenwick { private final int[] f; Fenwick(int n) { f = new int[n]; } void update(int i, int val) { for (; i < f.length; i += i & -i) { f[i] += val; } } private int pre(int i) { int res = 0; for (; i > 0; i &= i - 1) { res += f[i]; } return res; } int query(int l, int r) { if (r < l) { return 0; } return pre(r) - pre(l - 1); } } class Solution { public List<Integer> countOfPeaks(int[] nums, int[][] queries) { int n = nums.length; Fenwick f = new Fenwick(n - 1); for (int i = 1; i < n - 1; i++) { update(f, nums, i, 1); } List<Integer> ans = new ArrayList<>(); for (int[] q : queries) { if (q[0] == 1) { ans.add(f.query(q[1] + 1, q[2] - 1)); continue; } int i = q[1]; for (int j = Math.max(i - 1, 1); j <= Math.min(i + 1, n - 2); j++) { update(f, nums, j, -1); } nums[i] = q[2]; for (int j = Math.max(i - 1, 1); j <= Math.min(i + 1, n - 2); j++) { update(f, nums, j, 1); } } return ans; } private void update(Fenwick f, int[] nums, int i, int val) { if (nums[i - 1] < nums[i] && nums[i] > nums[i + 1]) { f.update(i, val); } } }
cpp 解法, 执行用时: 489 ms, 内存消耗: 227.8 MB, 提交时间: 2024-06-16 23:19:46
class Fenwick { vector<int> f; public: Fenwick(int n) : f(n) {} void update(int i, int val) { for (; i < f.size(); i += i & -i) { f[i] += val; } } int pre(int i) { int res = 0; for (; i > 0; i &= i - 1) { res += f[i]; } return res; } int query(int l, int r) { if (r < l) { return 0; } return pre(r) - pre(l - 1); } }; class Solution { public: vector<int> countOfPeaks(vector<int>& nums, vector<vector<int>>& queries) { int n = nums.size(); Fenwick f(n - 1); auto update = [&](int i, int val) { if (nums[i - 1] < nums[i] && nums[i] > nums[i + 1]) { f.update(i, val); } }; for (int i = 1; i < n - 1; i++) { update(i, 1); } vector<int> ans; for (auto& q : queries) { if (q[0] == 1) { ans.push_back(f.query(q[1] + 1, q[2] - 1)); continue; } int i = q[1]; for (int j = max(i - 1, 1); j <= min(i + 1, n - 2); ++j) { update(j, -1); } nums[i] = q[2]; for (int j = max(i - 1, 1); j <= min(i + 1, n - 2); ++j) { update(j, 1); } } return ans; } };
python3 解法, 执行用时: 939 ms, 内存消耗: 67 MB, 提交时间: 2024-06-16 23:19:33
class Fenwick: __slots__ = 'f' def __init__(self, n: int): self.f = [0] * n def update(self, i: int, val: int) -> None: while i < len(self.f): self.f[i] += val i += i & -i def pre(self, i: int) -> int: res = 0 while i > 0: res += self.f[i] i &= i - 1 return res def query(self, l: int, r: int) -> int: if r < l: return 0 return self.pre(r) - self.pre(l - 1) class Solution: def countOfPeaks(self, nums, queries): n = len(nums) f = Fenwick(n - 1) def update(i: int, val: int) -> None: if nums[i - 1] < nums[i] and nums[i] > nums[i + 1]: f.update(i, val) for i in range(1, n - 1): update(i, 1) ans = [] for op, i, val in queries: if op == 1: ans.append(f.query(i + 1, val - 1)) continue for j in range(max(i - 1, 1), min(i + 2, n - 1)): update(j, -1) nums[i] = val for j in range(max(i - 1, 1), min(i + 2, n - 1)): update(j, 1) return ans