
LeetCode279 完全平方数
发布日期:2021-05-14 23:49:59
浏览次数:19
分类:精选文章
本文共 3949 字,大约阅读时间需要 13 分钟。
原题目
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
示例 1: 输入: n = 12 输出: 3 解释: 12 = 4 + 4 + 4. 示例 2: 输入: n = 13 输出: 2 解释: 13 = 4 + 9.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/perfect-squares题目分析
方法一:
bfs广搜:next=cur-j*j12 | |||||||||
---|---|---|---|---|---|---|---|---|---|
11 | 8 | 3 | |||||||
10 | 7 | 2 | 7 | 4 | 2 | ||||
9 | 6 | 1 | 6 | 3 | 1 | 3 | 0 |
方法二:
动态规划 状态转移方程:dp[ i ]=fmin(dp[ i ],dp[i - j * j]) 方法三: 数学 四平方和定理(Lagrange’s four-square theorem) 说明每个正整数均可表示为4个整数的平方和。 先判断这个数是否满足 4^a*(8b+7)如果满足,那么这个数就至少需要 4 个数的平方和表示。 如果不满足,再在上面除以 4 之后的结果上暴力尝试只需要 1 个数就能表示和只需要 2 个数就能表示的情况。 如果还不满足,那么就只需要 3 个数就能表示。 一个比1大的整数能够被写成两个平方的和的形式,当且仅当它的素数分解中不包含这样的素数,该素数对4取余等于3且该素数的指数为奇数。完整代码
方法一:
typedef struct QNode{ int data; struct QNode *next;}QNode,*QueuePtr;typedef struct{ QueuePtr front; QueuePtr rear;}LinkQueue;void InitQueue(LinkQueue *Q){ Q->rear=Q->front=(QueuePtr)malloc(sizeof(QNode)); Q->front->next=NULL;}void DestroyQueue(LinkQueue *Q){ QueuePtr p=Q->front; while(p) { Q->front=p->next; free(p); p=Q->front; }}void ClearQueue(LinkQueue *Q){ QueuePtr p=Q->front->next; Q->rear=Q->front; while(p) { Q->front=p->next; free(p); p=Q->front; }}bool QueueEmpty(LinkQueue Q){ if(Q.front==Q.rear) return true; else return false;}int QueueLength(LinkQueue Q){ int len=0; while(Q.front!=Q.rear) { len++; Q.front=Q.front->next; } return len;}void EnQueue(LinkQueue *Q,int e){ QueuePtr p=(QueuePtr)malloc(sizeof(QNode)); p->data=e; p->next=NULL; Q->rear->next=p; Q->rear=p;}void DeQueue(LinkQueue *Q){ if(Q->rear==Q->front)return; QueuePtr p; p=Q->front->next; Q->front->next=p->next; if(p==Q->rear)Q->rear=Q->front; free(p);}int GetHead(LinkQueue Q){ return Q.front->next->data;}void QueueTraverse(LinkQueue Q){ QueuePtr p=Q.front->next; while(p) { printf("%d ",p->data); p=p->next; } printf("\n");}int numSquares(int n){ int steps=0; LinkQueue Q; InitQueue(&Q); EnQueue(&Q,n); int *vis=(int *)malloc(sizeof(int)*(n+1)); memset(vis,0,sizeof(int)*(n+1)); while(!QueueEmpty(Q)) { steps++; int len=QueueLength(Q);//printf("%d %d\n",steps,len); for(int i=0;i
方法二:
typedef struct QNode{ int data; struct QNode *next;}QNode,*QueuePtr;typedef struct{ QueuePtr front; QueuePtr rear;}LinkQueue;void InitQueue(LinkQueue *Q){ Q->rear=Q->front=(QueuePtr)malloc(sizeof(QNode)); Q->front->next=NULL;}void DestroyQueue(LinkQueue *Q){ QueuePtr p=Q->front; while(p) { Q->front=p->next; free(p); p=Q->front; }}void ClearQueue(LinkQueue *Q){ QueuePtr p=Q->front->next; Q->rear=Q->front; while(p) { Q->front=p->next; free(p); p=Q->front; }}bool QueueEmpty(LinkQueue Q){ if(Q.front==Q.rear) return true; else return false;}int QueueLength(LinkQueue Q){ int len=0; while(Q.front!=Q.rear) { len++; Q.front=Q.front->next; } return len;}void EnQueue(LinkQueue *Q,int e){ QueuePtr p=(QueuePtr)malloc(sizeof(QNode)); p->data=e; p->next=NULL; Q->rear->next=p; Q->rear=p;}void DeQueue(LinkQueue *Q){ if(Q->rear==Q->front)return; QueuePtr p; p=Q->front->next; Q->front->next=p->next; if(p==Q->rear)Q->rear=Q->front; free(p);}int GetHead(LinkQueue Q){ return Q.front->next->data;}void QueueTraverse(LinkQueue Q){ QueuePtr p=Q.front->next; while(p) { printf("%d ",p->data); p=p->next; } printf("\n");}int numSquares(int n){ int steps=0; LinkQueue Q; InitQueue(&Q); EnQueue(&Q,n); int *vis=(int *)malloc(sizeof(int)*(n+1)); memset(vis,0,sizeof(int)*(n+1)); while(!QueueEmpty(Q)) { steps++; int len=QueueLength(Q);//printf("%d %d\n",steps,len); for(int i=0;i
方法三
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年05月02日 18时12分37秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
[白话解析] 深入浅出熵的概念 & 决策树之ID3算法
2021-05-09
[梁山好汉说IT] 梁山好汉和抢劫银行
2021-05-09
[源码解析] 消息队列 Kombu 之 基本架构
2021-05-09
[源码分析] 消息队列 Kombu 之 启动过程
2021-05-09
[源码分析] 消息队列 Kombu 之 Consumer
2021-05-09
抉择之苦
2021-05-09
wx.NET CLI wrapper for wxWidgets
2021-05-09
ASP.NET MVC Action Filters
2021-05-09
Powershell中禁止执行脚本解决办法
2021-05-09
HTTP协议状态码详解(HTTP Status Code)
2021-05-09
OO_Unit2 多线程电梯总结
2021-05-09
04_Mysql配置文件(重要参数)
2021-05-09
python 序列化及其相关模块(json,pickle,shelve,xml)详解
2021-05-09
JavaSE总结
2021-05-09
手动造轮子——基于.NetCore的RPC框架DotNetCoreRpc
2021-05-09
Python IO编程
2021-05-09