首页 > 其他分享 >2024-09-18:用go语言,给定一个从 0 开始的长度为 n 的正整数数组 nums 和一个二维操作数组 queries,每个操作由一个下标值 indexi 和一个数值 ki 组成。 开始时,数

2024-09-18:用go语言,给定一个从 0 开始的长度为 n 的正整数数组 nums 和一个二维操作数组 queries,每个操作由一个下标值 indexi 和一个数值 ki 组成。 开始时,数

时间:2024-09-24 14:28:19浏览次数:3  
标签:元素 nums 标记 标值 ids 数组 queries


2024-09-18:用go语言,给定一个从 0 开始的长度为 n 的正整数数组 nums 和一个二维操作数组 queries,每个操作由一个下标值 indexi 和一个数值 ki 组成。

开始时,数组中的所有元素都是未标记的。依次执行 m 次操作,每次操作的过程如下:

1.如果下标 indexi 对应的元素还未标记,则标记这个元素。

2.然后再标记数组中最小的未标记元素,标记 ki 个。如果有多个值相等的未标记元素,优先标记下标较小的。若未标记元素不足 ki 个,则将它们全部标记。

我们需要返回一个长度为 m 的数组 answer,其中 answer[i] 表示执行第 i 次操作后,数组中未标记元素的和值。

输入:nums = [1,2,2,1,2,3,1], queries = [[1,2],[3,3],[4,2]]。

输出:[8,3,0]。

解释:

我们依次对数组做以下操作:

标记下标为 1 的元素,同时标记 2 个未标记的最小元素。标记完后数组为 nums = [1,2,2,1,2,3,1] 。未标记元素的和为 2 + 2 + 3 + 1 = 8 。

标记下标为 3 的元素,由于它已经被标记过了,所以我们忽略这次标记,同时标记最靠前的 3 个未标记的最小元素。标记完后数组为 nums = [1,2,2,1,2,3,1] 。未标记元素的和为 3 。

标记下标为 4 的元素,由于它已经被标记过了,所以我们忽略这次标记,同时标记最靠前的 2 个未标记的最小元素。标记完后数组为 nums = [1,2,2,1,2,3,1] 。未标记元素的和为 0 。

答案2024-09-18:

chatgpt

题目来自leetcode3080。

大体步骤如下:

1.初始化变量:给定 nums 数组和 queries 二维数组,创建一个长度为 nids 数组,其中 nnums 数组的长度。初始化 s 为 0。

2.遍历 nums 数组,同时计算数组元素的和 s,并将每个元素的索引存入 ids 数组中。

3.对 ids 数组进行稳定排序,排序依据是对应元素在 nums 中的值。

4.创建一个答案数组 ans,长度为 queries 的长度,用于存储每次操作后未标记元素的和值。

5.遍历 queries 数组,对每个操作进行处理:

  • 获取操作指令中的下标 i 和数值 k
  • 更新当前和 s,减去下标 i 对应的元素值并将其置为 0,表示已标记。
  • 在已排序的 ids 中找到最小值且未标记的元素进行标记,标记数量为 k。更新 s 和对应元素值为 0。
  • 将当前未标记元素的和值 s 存入答案数组 ans 中。

6.返回答案数组 ans

总的时间复杂度:

  • 初始化和遍历 nums 数组、对 ids 数组排序、处理每个查询操作都需要 O(n log n) 的时间。
  • 所以总的时间复杂度为 O(n log n) + O(m * log n),其中 nnums 数组的长度,mqueries 的长度。

总的额外空间复杂度:

  • 需要额外的空间来存储 idsans 数组,以及函数调用栈的空间等。
  • idsans 数组的长度分别为 nm,额外空间复杂度为 O(n + m)。
  • 函数调用栈的空间复杂度为 O(1)。
  • 所以总的额外空间复杂度为 O(n + m)。

Go完整代码如下:

package main

import (
	"fmt"
	"slices"
)

func unmarkedSumArray(nums []int, queries [][]int) []int64 {
	s, n := 0, len(nums)
	ids := make([]int, n)
	for i, x := range nums {
		s += x
		ids[i] = i
	}
	slices.SortStableFunc(ids, func(i, j int) int { return nums[i] - nums[j] })

	ans := make([]int64, len(queries))
	j := 0
	for qi, p := range queries {
		i, k := p[0], p[1]
		s -= nums[i]
		nums[i] = 0 // 标记
		for ; j < n && k > 0; j++ {
			i := ids[j]
			if nums[i] > 0 { // 没有被标记
				s -= nums[i]
				nums[i] = 0
				k--
			}
		}
		ans[qi] = int64(s)
	}
	return ans
}

func main() {
	nums := []int{1, 2, 2, 1, 2, 3, 1}
	queries := [][]int{{1, 2}, {3, 3}, {4, 2}}
	fmt.Println(unmarkedSumArray(nums, queries))
}

2024-09-18:用go语言,给定一个从 0 开始的长度为 n 的正整数数组 nums 和一个二维操作数组 queries,每个操作由一个下标值 indexi 和一个数值 ki 组成。 开始时,数_后端

Rust完整代码如下:

fn unmarked_sum_array(mut nums: Vec<i32>, queries: Vec<Vec<i32>>) -> Vec<i64> {
    let n = nums.len();
    let mut ids: Vec<usize> = (0..n).collect();
    ids.sort_by(|&i, &j| nums[i].cmp(&nums[j]));

    let mut s = nums.iter().sum::<i32>();
    let mut ans = Vec::new();
    let mut j = 0;

    for p in queries {
        let qi = p[0] as usize;
        let mut i = p[1] as usize;
        s -= nums[i];
        nums[i] = 0;

        while j < n && i > 0 {
            let idx = ids[j];
            if nums[idx] > 0 {
                s -= nums[idx];
                nums[idx] = 0;
                i -= 1;
            }
            j += 1;
        }

        ans.push(s as i64);
    }

    ans
}

fn main() {
    let nums = vec![1, 2, 2, 1, 2, 3, 1];
    let queries = vec![vec![1, 2], vec![3, 3], vec![4, 2]];
    println!("{:?}", unmarked_sum_array(nums, queries));
}

2024-09-18:用go语言,给定一个从 0 开始的长度为 n 的正整数数组 nums 和一个二维操作数组 queries,每个操作由一个下标值 indexi 和一个数值 ki 组成。 开始时,数_空间复杂度_02


标签:元素,nums,标记,标值,ids,数组,queries
From: https://blog.51cto.com/moonfdd/12099407

相关文章

  • 2024-09-14:用go语言,给定一个正整数数组 nums,定义一个加密函数 encrypt(x),其将一个整数
    2024-09-14:用go语言,给定一个正整数数组nums,定义一个加密函数encrypt(x),其将一个整数x的每一位数字都替换为x中的最大数字,然后返回加密后的数字。例如,encrypt(523)会返回555,encrypt(213)会返回333。现在需要计算数组中所有元素加密后的和,然后返回这个和。输入:nums=[10,2......
  • Java 数据库存储数组的方法
    在现代软件开发中,数组是常用的数据结构之一。然而,在关系数据库中直接存储数组并不是一个简单的任务。关系数据库通常擅长存储简单的数据类型如整数、字符串和日期等,但对于复杂的数据类型如数组、列表或对象,通常需要采用特殊的方法进行处理。本文将详细介绍几种在Java中将数组存储到......
  • go基础-4.数组、切片、map
    数组数组(Array)是一种非常常见的数据类型,几乎所有的计算机编程语言中都会用到它数组里的元素必须全部为同一类型,要嘛全部是字符串,要嘛全部是整数声明数组时,必须指定其长度或者大小packagemainimport"fmt"funcmain(){vararray[3]int=[3]int{1,2,3}fmt.Pr......
  • 算法题:数组中的第K个最大元素
    数组中的第K个最大元素问题描述:在未排序的数组中找到第K个最大的元素。解题思路:可以使用最小堆(优先队列)来解决这个问题。将数组中的元素依次加入最小堆中,当堆的大小超过K时,就弹出堆顶元素(即当前最小的元素)。最后,堆顶元素即为第K个最大的元素。Java代码实现(这里使用Java的......
  • 信息学奥赛复赛复习01-CSP-J2019-01-字符、字符数组、字符串、string、字符串读取
    信息学奥赛复赛复习01-CSP-J2019-01-字符、字符数组、字符串、string、字符串读取PDF文档公众号回复关键字:2024092312019CSP-J题目1数字游戏[题目描述]小K同学向小P同学发送了一个长度为8的01字符串来玩数字游戏,小P同学想要知道字符串中究竟有多少个1。注......
  • 二维矩阵的行、列、斜线特征(二维数组)
    1.行特征二维n*m矩阵,用x[i][j]表示第i行第j列的元素。同一行的元素的i值是相同的。例如,上图中绿色格子的数组元素分别是x[4][1],x[4][2],x[4][3],x[4][4],x[4][5],x[4][6]。2.列特征二维n*m矩阵,用x[i][j]表示第i行第j列的元素。同一列的元素的j值是相同......
  • Python NumPy处理数组的基本用法代码示例
    NumPy是一个用于处理数组(向量和矩阵)以及进行数值运算的Python库。下面是一些简单的例子来展示如何使用NumP:示例1:创建数组importnumpyasnpa=np.array([1,2,3])#创建一个一维数组b=np.array([[1,2,3],[4,5,6]])#创建一个二维数组print(a)print(b)示......
  • 数组组成的最小数字 - 华为OD统一考试(E卷)
    2024华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集题目描述给定一个整型数组,请从该数组中选择3个元素组成最小数字并输出(如果数组长度小于3,则选择数组中所有元素来组成最小数字)。输入描述一行用半角逗号分割的字符串记录的整型数组,0<数组长度<=10......
  • 数据结构之线性表——LeetCode:80. 删除有序数组中的重复项 II,88. 合并两个有序数组,4.
    80.删除有序数组中的重复项II题目描述80.删除有序数组中的重复项II给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用O(1)额外......
  • 小美的数组合并(美团20240427年暑期实习笔试真题)
    题目:小美的数组合并小美拿到了一个数组,她每次操作可以将两个相邻元素ai合并为一个元素,合并后的元素为原来两个元素之和。小美希望最终数组的最小值不小于k。她想知道有多少种不同的合并结果?输入描述第一行输入两个正整数n,k,代表数组大小和数组的最大值。第二行输入个正整数ai,......