算法编程题-优势洗牌

news2024/12/27 2:37:07

算法编程题-优势洗牌

    • 原题描述
    • 方法一、排序+二分查找
      • 思路简述
      • 代码实现
      • 复杂度分析
    • 方法二、红黑树
      • 思路简述
      • 代码实现
      • 复杂度分析
    • 方法三、贪心
      • 思路简述
      • 代码实现
      • 复杂度分析

摘要:本文将对LeetCode原题优势洗牌进行介绍,从最容易想到的方法开始,循序渐进,一步步优化,对于每一种方法,都给出基于golang语言实现的且通过所有测试用例的完整代码,并且给出相应的复杂度分析。
关键词:LeetCode,面试,排序,贪心,golang

原题描述

给定两个整数数组nums1和nums2,要求给出nums1数组的一个排列,使其相比于nums2的优势最大化,所谓的优势指的就是nums1对应位置大于nums2对应位置的个数。

方法一、排序+二分查找

思路简述

从贪心的角度出发,对于nums2每一个数(相当于是一个对手),nums1这边应该尽可能派出最弱但是又能战胜对方的,因此可以对于nums1排序,基于二分查找从nums1中找最小的大于nums2对应位置的数,如果没有,则取nums1中最小的数应战。但是由于一个数只能用一次,所以要从nums1中删除出战的数字。

代码实现

func advantageCount(nums1 []int, nums2 []int) []int {
    sort.Slice(nums1, func(i, j int) bool {
		return nums1[i] < nums1[j]
	})
	n := len(nums1)
	res := make([]int, 0, n)
	for i := 0; i < n; i++ {
		pos := findMinLarger(nums1, nums2[i])
		if pos == -1 {
			pos = 0
		}
		res = append(res, nums1[pos])
		nums1 = append(nums1[: pos], nums1[pos + 1:]...)
	}
	return res
}


func findMinLarger(nums []int, target int) int {
	n := len(nums)
	low := 0
	high := n - 1
	for low < high {
		mid := (low + high) / 2
		if nums[mid] > target {
			high = mid
		} else {
			low = mid + 1
		}
	}
	if nums[low] > target {
		return low
	}
	return -1
}

LeetCode运行截图如下:
在这里插入图片描述

复杂度分析

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2),因为移除元素这个操作,需要移动数组中的元素,所以每一次选择出战数字的复杂度都是 O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

方法二、红黑树

思路简述

考虑如何优化上一种做法的时间复杂度,遍历的 O ( n ) O(n) O(n)时间复杂度是肯定没有办法优化的,那么删除元素这个操作呢?有没有什么数据结构支持对于数据的增删改查时间复杂度都是 O ( l o g n ) O(logn) O(logn),且可以方便地进行范围查询,答案其实有很多,比如说跳表,AVL树,红黑树甚至B+树也是可以的。我们这里以红黑树为例来说明这个问题。由于golang标准库中没有红黑树这个数据结构,但是LeetCode针对golang语言提前导入了一个第三方的数据结构包,可以使用其中的红黑树实现。但是这个红黑树在实现这个问题上有很多难受的地方,一个是题目中的数组中是有重复数字的,而这个红黑树数字是不允许重复的,二是这个提供的接口ceiling取的是最小的大于等于某个数的开销,这个由于数组里面是整数,可以通过将目标值加一再去查找解决。具体参考以下的代码实现。

代码实现

import (
    rbt "github.com/emirpasic/gods/trees/redblacktree"
)


func advantageCount(nums1 []int, nums2 []int) []int {
	rbtree := rbt.NewWithIntComparator()
	for _, num := range nums1 {
		incrRbtree(rbtree, num)
	}
	n := len(nums2)
	res := make([]int, 0, n)
	for i := 0; i < n; i++ {
		node, found := rbtree.Ceiling(nums2[i] + 1)
		if found {
			res = append(res, node.Key.(int))
			decrRbtree(rbtree, node.Key.(int))
		} else {
            res = append(res, -1)
        }
	}

    remainVals := make([]int, 0, n)
    keys := rbtree.Keys()
    k := 0
    for j := range keys {
        key := keys[j].(int)
        var c int
        ret, found := rbtree.Get(key)
        if !found {
            c = 0
        } else {
            c = ret.(int)
        }
        for i := 0; i < c; i++ {
            remainVals = append(remainVals, key)
        }
    }
    for i := range res {
        if res[i] == -1 {
            res[i] = remainVals[k]
            k++
        }
    }
	return res
}

func incrRbtree(rbtree *rbt.Tree, val int) {
    var count int
    ret, found := rbtree.Get(val)
    if !found {
        count = 0
    } else {
        count = ret.(int)
    }
    rbtree.Put(val, count + 1)
}

func decrRbtree(rbtree *rbt.Tree, val int) {
    var count int
    ret, found := rbtree.Get(val)
    if !found {
        return
    } else {
        count = ret.(int)
    }
    if count == 1 {
        rbtree.Remove(val)
        return
    }
    rbtree.Put(val, count - 1)
}

LeetCode运行截图如下:
在这里插入图片描述

复杂度分析

  • 时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
  • 空间复杂度: O ( n ) O(n) O(n)

方法三、贪心

思路简述

换一种贪心策略,按照田忌赛马的思路去想,如果我方当前的最弱马强于对方最弱马,那就用最弱马去对战最弱马,否则去对战对方的最强马。具体过程参考代码实现。

代码实现

func advantageCount(nums1 []int, nums2 []int) []int {
    sort.Slice(nums1, func(i, j int) bool {
		return nums1[i] < nums1[j]
	})
    n := len(nums1)
    // nums2不能排序
    idxs := make([]int, n)
    for i := 0; i < n; i++ {
        idxs[i] = i
    }
    sort.Slice(idxs, func(i, j int) bool {
        return nums2[idxs[i]] < nums2[idxs[j]]
    })
	res := make([]int, n)
    k := n - 1
    j := 0
	for _, num := range nums1 {
        if num > nums2[idxs[j]] {
            res[idxs[j]] = num
            j++
        } else {
            res[idxs[k]] = num
            k--
        }
    }
	return res
}

LeetCode运行截图如下:
在这里插入图片描述

复杂度分析

  • 时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
  • 空间复杂度: O ( n ) O(n) O(n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2252019.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【从零开始的LeetCode-算法】3264. K 次乘运算后的最终数组 I

给你一个整数数组 nums &#xff0c;一个整数 k 和一个整数 multiplier 。 你需要对 nums 执行 k 次操作&#xff0c;每次操作中&#xff1a; 找到 nums 中的 最小 值 x &#xff0c;如果存在多个最小值&#xff0c;选择最 前面 的一个。将 x 替换为 x * multiplier 。 请你…

ERROR in [eslint] Invalid Options ‘extensions‘ has been removed.

看着这个报错 感觉是版本不对引起的 ERROR in [eslint] Invalid Options: - Unknown options: extensions - extensions has been removed. ERROR in Error: Child compilation failed: [eslint] Invalid Options: - Unknown options: extensions - extensions has b…

SpringCloud书单推荐

重新定义SpringCloud实战 129 疯狂SpringCloud微服务架构实战 SpringBootSpringCloud微服务开发实战 点餐系统 SpringCloud微服务架构实战派 日访问量3000W平台 SpringCloud Alibaba微服务原理与实战 Spring CloudNginx 极简spring cloud实战 Spring Cloud 微服…

试题转excel;试题整理工具;试卷转excel;word转excel

一、问题描述 我父亲是一名教师&#xff0c;偶尔会需要将试卷转excel&#xff0c;方便管理处理一些特别重要的题目 于是&#xff0c;就抽空写一个专门将试题转excel的工具&#xff0c;便于各位教师从业者和教育行业的朋友更好的整理试题&#xff0c;减少一点重复枯燥的工作 …

Node.js Fastify装饰器:提升你的API性能与功能

在Node.js的世界中&#xff0c;Fastify以其卓越的性能和插件化架构脱颖而出&#xff0c;成为构建高效API的首选框架之一。Fastify的装饰器功能&#xff0c;允许开发者以声明式的方式增强和扩展核心对象&#xff0c;如请求&#xff08;Request&#xff09;和响应&#xff08;Res…

数据库管理-第267期 23ai:Oracle Data Redaction演示(20241128)

数据库管理267期 2024-11-286 数据库管理-第267期 23ai&#xff1a;Oracle Data Redaction演示&#xff08;20241128&#xff09;1 示例表及数据2 创建编校策略2.1 名字全编校2.2 电话部分编校 3 DML演示3.1 场景13.2 场景2 总结 数据库管理-第267期 23ai&#xff1a;Oracle Da…

C#VB.Net项目一键多国语言显示

如何在项目什么都不做一键支持多国语言显示 开始我们的一键快捷使用之旅 01.创建多语言项目 02.一键批量窗口开启本地化,添加选中内容添加Mu方法 03.一键快捷翻译 04.运行查看效果 01.创建多语言项目 创建多语言项目前,请先下载安装&#xff0c;注册并登录. 为了便于演示这…

像素流送api ue多人访问需要什么显卡服务器

关于像素流送UE推流&#xff0c;在之前的文章里其实小芹和大家聊过很多&#xff0c;不过今天偶然搜索发现还是有很多小伙伴&#xff0c;在搜索像素流送相关的问题&#xff0c;搜索引擎给的提示有这些。当然这些都是比较短的词汇&#xff0c;可能每个人真正遇到的问题和想获取的…

构建高可用系统设计OpenStack、Docker、Mesos和Kubernetes(简称K8s)

如果构建高可用、高并发、高效运维的大型系统 大型系统架构设计包括业务层设计、服务层设计、基础架层设计、存储层设计、网络层协同设计来完成。 一、业务层 根据主要业务范畴的分类和特征提取&#xff0c;抽象出独立的业务系统&#xff0c;分别统计系统的用户角色群体、访…

零基础Python学习

1.环境搭建 1.1 安装运行环境python3.13 Welcome to Python.org 1.2 安装集成开发环境PyCharm PyCharm: the Python IDE for data science and web development 1.3 创建项目 && 设置字体 2.基础语法 2.1 常量与表达式 在python中整数除整数不会优化&#xff0c;所…

Java Map

Map——广义集合的子集 HashTable是早期Java类库提供的一个哈希表实现&#xff0c;扩展了Dictionary类&#xff0c;类结构上与HashMap明显不同&#xff0c;本身是同步的&#xff0c;不支持null键和值&#xff0c;由于同步导致的性能开销&#xff0c;已经很少被推荐使用。 Hash…

【MySQL — 数据库基础】MySQL的安装与配置 & 数据库简单介绍

数据库基础 本节目标 掌握关系型数据库&#xff0c;数据库的作用掌握在Windows和Linux系统下安装MySQL数据库了解客户端工具的基本使用和SQL分类了解MySQL架构和存储引擎 1. 数据库的安装与配置 1.1 确认MYSQL版本 处理无法在 cmd 中使用 mysql 命令的情况&a…

实测数据处理(BP算法处理)——SAR成像算法系列(九)

系列文章目录 《SAR学习笔记-SAR成像算法系列&#xff08;一&#xff09;》 《后向投影算法&#xff08;BPA&#xff09;-SAR成像算法系列&#xff08;二&#xff09;》 《后向投影算法&#xff08;续&#xff09;-SAR成像算法系列&#xff08;八&#xff09;》 文章目录 一…

(数据结构与算法)如何提高学习算法的效率?面试算法重点有哪些?面试需要哪些能力?

面试官眼中的求职者 通过对你算法的考察&#xff01;&#xff01;&#xff01;&#xff01; 缩进太多&#xff01;&#xff01;一般不要超过三层&#xff01;&#xff01;&#xff01;缩进越少&#xff0c;bug越少&#xff1b;逻辑比较复杂&#xff0c;把这些包装成为函数&…

Day05:缓存双写一致性

redis做为缓存&#xff0c;mysql的数据如何与redis进行同步呢&#xff1f;&#xff08;双写一致性–强一致&#xff09; 一种是一致性要求比较高的同步方案&#xff0c;另一种是允许延迟一致的异步通知。 什么是双写一致性&#xff1f; 双写一致性&#xff1a;当修改了数据库…

vue3+typescript自定义input组件

官方文档&#xff1a;https://cn.vuejs.org/guide/components/events#%E5%AE%9A%E4%B9%89%E8%87%AA%E5%AE%9A%E4%B9%89%E4%BA%8B%E4%BB%B6 触发与监听事件​ 在组件的模板表达式中&#xff0c;可以直接使用 $emit 方法触发自定义事件 (例如&#xff1a;在 v-on 的处理函数中)…

代码之丑第一期-缩进

各位小伙伴们,大家好!咱今天就算是正式开张了。实不相瞒,第一期的内容早已写好,但唯独这开篇方式,笔者想了好些时间,包括但不限于如下风格: 斗破苍穹式(已经三刷):代码优雅之力,三段!级别:低级!百年孤独式(困扰于错综复杂的人物关系,放弃):多年以后,面对吐槽…

idea2024加载flowable6.8.1.36遇到的问题-idea启动flowable问题flowable源码启动问题

代码下载地址&#xff1a; https://gitee.com/hanpenghu_admin_admin/flowable6.8.1.git 1.首先是通过顶层目录maven clean install 发现很多子模块并不会install本地mavenStore库&#xff0c;这导致了&#xff0c;一堆相互依赖的模块报错找不到&#xff0c;所以需要根据报错…

Vue.js 中 v-for 指令的三种常见用法详解及key、value、id的作用

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;WebStorm 目录 遍历数组 介绍 代码 遍历对象数组 介绍 代码 遍历对象本身 介绍 代码 效果呈现 key、value、id的作用 1. value 2. key 3. id 在 Vue.js 中&#xff0c…

【论文投稿】国产游戏技术:迈向全球引领者的征途

【IEEE出版南方科技大学】第十一届电气工程与自动化国际会议&#xff08;IFEEA 2024)_艾思科蓝_学术一站式服务平台 更多学术会议论文投稿请看&#xff1a;https://ais.cn/u/nuyAF3 目录 国产游戏技术能否引领全球&#xff1f; 一、国产游戏技术的崛起之路 1.1 初期探索与积…