求整数的最小完全平方数个数

来源:互联网 发布:python 去除列表重复 编辑:程序博客网 时间:2024/05/21 17:10

今天在LeetCode OJ上刷算法,以前没有怎么看算法题。然后对着一道Medium的题目,想了整个下午,好不容易才解出来。贴了代码,分享一下自己奋斗一下午的成果,有不足的,请大家指出来哈!微笑
题目:
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 2because 13 = 4 + 9.
    #include <stdio.h>
    #include <stdlib.h>
    /* 记Array(i)为数字i的最小完全平方数个数
     * Array(0) = 0;
     * Array(1) = Array(1-1^2)+1;
     * Array(2) = Array(2-1^2)+1;
     * Array(3) = Array(3-1^2)+1;
     * 而Array(4) 有两种情况:
     * Array(4) = Array(4-1^2)+1;
     * Array(4) = Array(4-2^2)+1;
     * 而此时可知Array(4) = min{Array(4-1^2)+1,Array(4-2^2)+1}=1;
     * 依次类推,找到其规律,可得
     * Array(i) = min{Array(i-j^2)+1} (其中1<=i;1<=j且j=1,2,3...,在下面第二层for语句中,
     * 跳出的条件是当i-j^2<0,对于数组来说下标不能小于0)
     */
    void numSquares(int n) {
    int *Array = (int*)malloc(sizeof(int)*(n+1)),mindata;//mindata为记录最小值
    Array[0] = 0; 
    for (int i=1;i<=n;i++)  //从1开始历遍到n,用数组记录每个元素i的最小完全平方数个数
    {
    mindata = Array[i-1];
    for (int j=1;;j++)  //历遍所有的i-j^2,j=1,2,3...,然而找出最小的完全平方数个数
    {
    if (i-j*j>=0&&Array[i-j*j]<mindata)  //对其所有的情况进行比较,找出最小者
    {
    mindata = Array[i-j*j]; 
    }
    if(i-j*j<0) break;
    }
    Array[i] = mindata+1;//Array(i-j^2)+1,找出最小者后加1
    if(i==1) printf("Num\t\tleastNum(counts)\n");
    printf("%d\t\t%d\n",i,Array[i]);
    }
    free(Array);
    }
    int main()
    {
    int data;
    scanf("%d",&data);
    numSquares(data);
    return 0;
    }
0 0
原创粉丝点击