您的位置:首页 > Web前端

leetcode 279. Perfect Squares

2016-02-29 17:47 423 查看
Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n.

For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9.

// ConsoleApplication1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<vector>
#include<iostream>
using namespace std;

class Solution {
private:
int minnum;
vector<int>minpath;
public:
void do_once(int squarenum,int& remain,vector<int>&path)
{
if(path.size()>=minnum-1)
return;
for(int i=squarenum;i>=1;i--)
{
vector<int>pathcopy=path;
pathcopy.push_back(i);
int rem=remain-i*i;
if(rem==0)
{
if(pathcopy.size()<minnum)
{
minnum=pathcopy.size();
minpath=pathcopy;
}
}
else if(rem>0)
{
if(pathcopy.size()+1<minnum)
{
int startnum=sqrt(remain-i*i);
if(startnum>i)
startnum=i;
do_once(startnum,rem,pathcopy);

}
}
}
}
int numSquares(int n) {
int outsquare=sqrt(n);
minnum=100000;
while(outsquare!=0)
{
if(n/(outsquare*outsquare)>=minnum)
return minnum;
int remain=n;
vector<int>path;
do_once(outsquare,remain,path);
outsquare--;
}
}
};

int _tmain(int argc, _TCHAR* argv[])
{
Solution sl;
cout<<sl.numSquares(7168);

system("pause");
return 0;
}

超时

稍作修改

class Solution {
private:
int minnum;
vector<int>minpath;
public:
void do_once(int squarenum,int& remain,vector<int>&path)
{
if(path.size()>=minnum-1)
return;
for(int i=squarenum;i>=1;i--)
{
vector<int>pathcopy=path;
pathcopy.push_back(i);
int rem=remain-i*i;
if(rem==0)
{
if(pathcopy.size()<minnum)
{
minnum=pathcopy.size();
minpath=pathcopy;
}
}
else if(rem>0)
{
if(pathcopy.size()+1<minnum)
{
int startnum=sqrt(remain-i*i);
if(startnum>i)
startnum=i;
do_once(startnum,rem,pathcopy);
}
}
}
}
int numSquares(int n) {
int outsquare=sqrt(n);
minnum=100000;
while(outsquare!=0)
{
if(n/(outsquare*outsquare)>=minnum)
return minnum;
int insquare=sqrt(n-outsquare*outsquare);
if(insquare>outsquare)
insquare=outsquare;
int remain=n-outsquare*outsquare;
if(remain==0)
return 1;
vector<int>path;
path.push_back(outsquare);
do_once(insquare,remain,path);
outsquare--;
}
return minnum;
}
};

accepted
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: