news 2026/7/21 6:34:59

2026-07-21:可由多种立方和构造的整数。用go语言,给定一个正整数上限 n,一个正整数 x 被称为“好整数”,当且仅当它可以表示为两组不同的正整数对 (a, b) 的立方和,其中 a 和 b

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2026-07-21:可由多种立方和构造的整数。用go语言,给定一个正整数上限 n,一个正整数 x 被称为“好整数”,当且仅当它可以表示为两组不同的正整数对 (a, b) 的立方和,其中 a 和 b

2026-07-21:可由多种立方和构造的整数。用go语言,给定一个正整数上限 n,一个正整数 x 被称为“好整数”,当且仅当它可以表示为两组不同的正整数对 (a, b) 的立方和,其中 a 和 b 都是正整数且满足 a ≤ b。换句话说,存在至少两种不同的 (a, b) 组合,使得 x = a³ + b³。现在需要找出所有不超过 n 的好整数,并将它们按从小到大的顺序以列表形式返回。

1 <= n <= 1000000000。

输入: n = 4104。

输出: [1729,4104]。

解释:

在小于等于 4104 的整数中,好整数包括:

1729:1³ + 12³ = 1729,以及 9³ + 10³ = 1729。

4104:2³ + 16³ = 4104,以及 9³+ 15³ = 4104。

因此,答案是 [1729, 4104]。

题目来自力扣3890。

大体步骤如下:

一、预计算阶段(init函数)

1. 确定枚举范围

  • 上限mx = 1_000_000_000
  • 对于a,从1开始枚举,直到a³ > mx/2为止。
    为什么是mx/2?因为我们要找a³ + b³ ≤ mxa ≤ b,当本身就超过mx/2时,即使最小的b = a,和也会超过mx,所以无需继续枚举。

2. 双层循环枚举所有(a, b)组合

  • 外层循环枚举a,内层循环枚举b(从a开始,保证a ≤ b)。
  • 内层循环终止条件是a³ + b³ > mx,一旦超过就break内层循环。
  • 对每一对(a, b),计算x = a³ + b³,并在一个哈希表cnt中统计该值出现的次数。

3. 筛选好整数

  • 遍历哈希表cnt,对于出现次数c > 1x,说明它至少可以由两组不同的(a, b)表示,因此将其加入goodIntegers列表。
  • 这里没有存储具体组合,只关心出现次数是否大于 1。

4. 排序

  • slices.SortgoodIntegers从小到大排序,以便后续二分查找。

备注:题目描述提到“两组不同的正整数对”,代码中当c > 1即判定为好整数。这是正确的,因为枚举时保证了a ≤ b,所以同一个x如果有多个计数,必然对应不同的(a, b)组合(组合无序但已通过a ≤ b规范表示)。


二、查询阶段(findGoodIntegers函数)

1. 二分查找

  • 调用sort.SearchInts(goodIntegers, n+1),在已排序的goodIntegers中查找第一个大于n的元素的下标i
  • 由于goodIntegers是升序的,所有下标< i的元素都≤ n

2. 返回结果

  • 返回切片goodIntegers[:i],即所有不超过n的好整数,已经是有序的。

三、主函数中的示例

  • n = 4104,调用findGoodIntegers(4104)得到[1729, 4104],并打印。

四、复杂度分析

1. 预计算的时间复杂度

  • 外层循环a的范围:a³ ≤ 5e8(即mx/2),所以a最大约∛(5e8) ≈ 793
  • 内层循环b的范围:对于每个aba开始,直到b³ ≤ mx - a³
    总枚举的(a, b)对的数量大约是所有满足a ≤ ba³ + b³ ≤ 1e9的组合数。
  • 这是一个二维区域内的整点数,量级可以通过积分估计:
    • 条件a³ + b³ ≤ 1e9,且1 ≤ a ≤ b
    • u = a³, v = b³,则u + v ≤ 1e9,且u ≤ vuv是立方数。
    • 直接枚举点对数量级约为O(N^(2/3)),这里N = 1e9,所以N^(2/3) = (1e9)^(2/3) = 1e6级别。
  • 实际上这样的整数对数量大约是几十万到一百万左右。每次计算a³ + b³和哈希表操作为 O(1),所以预计算的总时间在可接受范围内,记为O(M),其中 M 是满足条件的(a, b)对的数量(约 10^5 ~ 10^6)。

2. 预计算的空间复杂度

  • 哈希表cnt存储所有可能的a³ + b³值,不同值的数量小于等于 M,也是O(M)
  • goodIntegers存储出现次数 >1 的值,数量远小于 M(题目提到共 1554 个),可视为 O(G),G 是好整数数量。
  • 整体额外空间复杂度为O(M)

3. 单次查询的时间复杂度

  • 只有一次二分查找:sort.SearchInts时间复杂度O(log G),G ≈ 1554,几乎常数时间。
  • 空间复杂度:返回切片可直接引用全局数组的部分,没有额外分配,O(1)额外空间。

总结:

  • 总时间复杂度:预计算 O(M)(约 10^5 ~ 10^6 级别),单次查询 O(log G)(几乎常数)。
  • 总额外空间复杂度:O(M),主要是哈希表存储所有不同立方和的计数。

Go完整代码如下:

packagemainimport("fmt""slices""sort")vargoodIntegers[]int// 1554 个funcinit(){constmx=1_000_000_000cnt:=map[int]int{}fora:=1;a*a*a<=mx/2;a++{forb:=a;a*a*a+b*b*b<=mx;b++{cnt[a*a*a+b*b*b]++}}forx,c:=rangecnt{ifc>1{goodIntegers=append(goodIntegers,x)}}slices.Sort(goodIntegers)}funcfindGoodIntegers(nint)[]int{i:=sort.SearchInts(goodIntegers,n+1)returngoodIntegers[:i]}funcmain(){n:=4104result:=findGoodIntegers(n)fmt.Println(result)}

Python完整代码如下:

# -*-coding:utf-8-*-definit_good_integers():"""初始化好整数列表,这些数可以用至少两种方式表示为两个立方数之和"""mx=1_000_000_000cnt={}a=1whilea*a*a<=mx//2:b=awhilea*a*a+b*b*b<=mx:val=a*a*a+b*b*b cnt[val]=cnt.get(val,0)+1b+=1a+=1good_integers=[]forx,cincnt.items():ifc>1:good_integers.append(x)good_integers.sort()returngood_integersdeffind_good_integers(n,good_integers):"""返回所有不大于 n 的好整数"""result=[]forxingood_integers:ifx<=n:result.append(x)else:breakreturnresultdefmain():good_integers=init_good_integers()n=4104result=find_good_integers(n,good_integers)print(result)if__name__=="__main__":main()

C++完整代码如下:

#include<iostream>#include<vector>#include<unordered_map>#include<algorithm>usingnamespacestd;vector<int>goodIntegers;// 全局初始化器namespace{structInitGoodIntegers{InitGoodIntegers(){constintmx=1'000'000'000;unordered_map<int,int>cnt;for(inta=1;a*a*a<=mx/2;a++){for(intb=a;a*a*a+b*b*b<=mx;b++){intval=a*a*a+b*b*b;cnt[val]++;}}for(constauto&[x,c]:cnt){if(c>1){goodIntegers.push_back(x);}}sort(goodIntegers.begin(),goodIntegers.end());}}initGoodIntegers;}vector<int>findGoodIntegers(intn){autoit=upper_bound(goodIntegers.begin(),goodIntegers.end(),n);intidx=distance(goodIntegers.begin(),it);returnvector<int>(goodIntegers.begin(),goodIntegers.begin()+idx);}intmain(){intn=4104;vector<int>result=findGoodIntegers(n);cout<<"[";for(size_t i=0;i<result.size();i++){cout<<result[i];if(i<result.size()-1){cout<<", ";}}cout<<"]"<<endl;return0;}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/21 6:29:18

C语言入门基础:头文件,注释,ASCLL,数据类型,原码 补码 反码,内存(求字节大小),局部/全局变量,强制转换,常用占位符,VS2022 scanf函数需要引入头文件

初识C语言&#xff1a; 第一个C语言程序&#xff1a; #include <stdio.h> int main () {printf("Hello\n");return 0; } C语言程序只能有一个main函数&#xff08;主函数&#xff09; return 0&#xff1b;结尾 库函数头文件查询网站&#xff1a; 1.Refere…

作者头像 李华
网站建设 2026/7/21 6:28:53

遥感影像多分辨率融合与标签不确定性处理技术

1. 项目背景与核心挑战遥感影像处理领域长期面临标签不确定性的困扰。我在处理哨兵2号L2A数据时发现&#xff0c;即使是专业标注团队提供的土地覆盖分类标签&#xff0c;在林地与农田过渡带也经常出现标注不一致的情况。这种标签模糊性会导致传统分类算法在这些区域产生高达30%…

作者头像 李华
网站建设 2026/7/21 6:28:12

2026年南京庭院公司拔管排污方便吗?业主亲测清仓服务真相

南京业主陈先生&#xff0c;2024年请人建了一座20平米的锦鲤池&#xff0c;半年后池水发绿、鱼总生病。他找过好几家公司&#xff0c;要么报价虚高&#xff0c;要么方案套模板。直到今年年初&#xff0c;他找到南京比德园艺服务有限公司&#xff0c;对方上门勘测后给出了一套详…

作者头像 李华
网站建设 2026/7/21 6:27:24

Python调用C++ DLL:extern “C“解决符号名不匹配问题

1. 项目概述&#xff1a;当Python遇上C DLL的“语言障碍” 混编开发&#xff0c;尤其是用Python调用C编译的动态链接库&#xff0c;是很多开发者为了追求性能或复用现有代码库时会走的一条路。听起来很美好&#xff0c;Python写业务逻辑&#xff0c;C处理计算密集型任务&#…

作者头像 李华
网站建设 2026/7/21 6:23:48

微信运动功能异常排查与2026最新解决方案

1. 微信运动功能消失的常见表现与原因分析微信运动作为微信生态内最受欢迎的轻量级健康功能之一&#xff0c;突然消失或异常确实会让人困扰。根据2026年最新用户反馈和技术支持数据&#xff0c;功能异常主要表现为三种典型情况&#xff1a;第一种是微信运动入口完全消失。在微信…

作者头像 李华
网站建设 2026/7/21 6:21:22

LangChain框架:大模型应用开发的高效解决方案

1. LangChain框架概述&#xff1a;大模型应用开发的瑞士军刀 LangChain是一个专为大型语言模型(LLM)应用开发设计的开源框架。它通过模块化设计解决了AI大模型在实际应用中的三大核心痛点&#xff1a;上下文管理、工具集成和工作流编排。这个框架最早由Harrison Chase在2022年提…

作者头像 李华