当前位置: 首页 > news >正文

马蜂窝网站怎么做创建网站需要什么平台

马蜂窝网站怎么做,创建网站需要什么平台,昌大建设滨州项目,辽宁建设工程信息网上文章目录 LeetCode?启动!!!题目:将元素分配到两个数组中 II题目描述代码与解题思路 每天进步一点点 LeetCode?启动!!! 又有段时间没写每日一题的分享了,原本今…

文章目录

  • LeetCode?启动!!!
  • 题目:将元素分配到两个数组中 II
    • 题目描述
    • 代码与解题思路
  • 每天进步一点点

LeetCode?启动!!!

在这里插入图片描述
又有段时间没写每日一题的分享了,原本今天是打算早上发完晨起计划之后发的,但是今天太忙了,忙着忙着一直没时间把文章写完,拖着拖着就拖到晚上了

只能在晚上离散数学的课上悄摸摸写完发了

题目:将元素分配到两个数组中 II

题目链接:将元素分配到两个数组中 II

题目描述

代码与解题思路

// 树状数组
type fenwick []int// 维护 [1, i] 的元素个数
func (f fenwick) add(i int) {for ; i < len(f); i += i & -i {f[i]++}
}// 获取 [1, i] 的元素个数和
func (f fenwick) pre(i int) (res int) {for ; i > 0; i &= i - 1 {res += f[i]}return res
}func resultArray(nums []int) []int {// 排序去重 -> 离散化sorted := slices.Clone(nums)slices.Sort(sorted)sorted = slices.Compact(sorted)m := len(sorted)a, b := []int{nums[0]}, []int{nums[1]}// 维护树状数组t1, t2 := make(fenwick, m+1), make(fenwick, m+1)for i, v := range sorted {if v == nums[0] {t1.add(i+1)} if v == nums[1] {t2.add(i+1)}}for _, x := range nums[2:] {// 二分查找离散化数组的下标位置l, r := 0, len(sorted)for l < r {mid := (l+r)>>1if sorted[mid] < x {l = mid+1} else {r = mid}}v := l+1// greaterCount: 用数组所有元素 - 小于等于 val 元素的数量 = 大于 val 元素的数量gc1 := len(a) - t1.pre(v)gc2 := len(b) - t2.pre(v)if gc1 > gc2 || gc1 == gc2 && len(a) <= len(b) {a = append(a, x)t1.add(v)} else {b = append(b, x)t2.add(v)}}return append(a, b...)
}

代码的核心思路比较短,题目比较好理解(看着像是一个简单的模拟题)但是他给到的数据范围是 10^5,也就是他没法用暴力的算法去做

根据题目需要维护大于某个数的元素个数的要求,以及 10^9 次方的数字大小,我们可以用离散化 + 维护树状数组解决

两个问题

1)如何离散化?

sorted := slices.Clone(nums)
slices.Sort(sorted)
sorted = slices.Compact(sorted)

排序去重好的 sorted 数组,假设是 [ 7, 12, 23, 40 ],我们在 nums 数组找到 23 这个元素的时候,就能根据这个元素在 sorted 数组中的位置,求的有 2 个数比他小,1 个数比他大

这就是离散化的意义

2)树状数组?

// 树状数组
type fenwick []int// 维护 [1, i] 的元素个数
func (f fenwick) add(i int) {for ; i < len(f); i += i & -i {f[i]++}
}// 获取 [1, i] 的元素个数和
func (f fenwick) pre(i int) (res int) {for ; i > 0; i &= i - 1 {res += f[i]}return res
}

关于上述代码的解释:(对于树状数组的简单解释)

为什么用树状数组?因为树状数组能够 logN 获取一个区间的前缀和,并能够 logN 的复杂度修改区间的值。

树状数组中,通过不断加上 lowbit 可以获得每个关键区间,让 [1, i] 区间增加或减少一个值(add 操作)

而通过不断减去 lowbit 可以获得区间和 [1, i](pre 操作)

求 lowbit 的方法:i & -i

减去 lowbit 的方法:i &= i-1

什么是 lowbit?

=> 10010 中,10 就是 lowbit

每天进步一点点

可以和我刷一辈子的每日一题吗?
一题一题,积累起来就是一辈子。

http://www.yayakq.cn/news/262221/

相关文章:

  • 唐山建站公司中国室内设计师网官网
  • 广州知名网站网站开发在哪个科目核算
  • 手机网站推广怎么做google 网站收录
  • 云南俊发建设集团网站商城网站的模块设计
  • 短租房网站哪家做最好郑州好的网站建站
  • 模块化建站工具建筑做网站
  • 网站维护一般做什么互联网基础知识入门
  • 广州番禺网站推广wordpress 对空间要求
  • 营销型网站模板免费下载广告推广方案
  • 计算机网站开发岗位有哪些成为网站开发工程师
  • 做网站公司 蓝纤科技东莞网站制作电话
  • 程序员做外包网站wordpress 苏醒主题
  • 手机型网站免费二维码生成工具
  • 江西网站建设与推广河北网站建设
  • 网页设计个人网站设计通州手机网站建设
  • 网站开发 源代码吾道ppt模板免费下载
  • 成都网站建设小程序北京学校线上教学
  • 网站开发的硬件环境和软件怎么写百度首页排名优化哪家专业
  • 网站建设张家港株洲建设工程造价信息网站
  • 网站设计公司排行榜wordpress被js挂马
  • 腾讯云电商网站建设北京网站开发公司哪家好
  • 网站解析错误飞猪关键词排名优化
  • 内蒙古建设厅网站官网济南企业网站搭建
  • 深圳seo推广英文seo推广
  • 网站开发框架是什么如何更改地图上的店名
  • 推广软件公司潍坊seo管理
  • 网站建设与管理教案网红营销案例
  • 做网站如何不被忽悠东营 微信网站建设
  • vultr怎么做网站广州做网站公司培训
  • 微信知彼网络网站建设wordpress主题转typecho