leetcode 279. Perfect Squares

2017-12-25  本文已影响0人  岛上痴汉

原题地址

https://leetcode.com/problems/perfect-squares/description/

题意

给定一个数n,求最少要几个平方数(1,4,9,25……)的和能组成这个数

思路

用的是很蠢的办法,没什么思路可言。

坑点

涉及到模运算的时候pow(i,2)要转成int类型的,发现类型转换会对值有影响。。。比如pow(5,2)=25,可是(int)pow(5,2)就等于24了。。。

代码

#include <iostream>
#include <vector>
#include <cmath>
#include <iomanip>


using namespace std;

class Solution {
public:
    int minForSome(vector<vector<int> > &vec, int cur, int sum) {
        int min = sum;
        for (int i = 1; i < cur; i++) {
            if (vec[i][sum] != 0 && vec[i][sum] < min) {
                min = vec[i][sum];
            }
        }
        return min;
    }
    int numSquares(int n) {
        int m = sqrt(n) + 1;
        int pre[n + 1];
        for (int i = 0; i <= n; i++) {
            pre[i] = i;
        }
        vector<vector<int> > vec(m + 1, vector<int>(n + 1, -1));
        for (int i = 1; i < m + 1; i++) {
            vec[i][0] = 0;
        }
        for (int i = 1; i < n + 1; i++) {
            vec[1][i] = i;
        }
        for (int i = 2; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if ((int)pow(i, 2) > j) {
                    vec[i][j] = 0;
                } else {
                    vec[i][j] = minForSome(vec, i, j % (i*i))+ j / (i*i);
                    if (i == 5 && j == 43) {
                    }
                }
            }
        }
        int min = n;
        for (int i = 1; i <= m; i++) {
            if (vec[i][n] < min && vec[i][n] != 0) {
                min = vec[i][n];
            }
        }
        return min;
    }
};
上一篇下一篇

猜你喜欢

热点阅读