279. Perfect Squares

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.

Solution 1 DP

//https://leetcode.com/discuss/62526/an-easy-understanding-dp-solution-in-java
	public static int numSquares(int n) {
        int[] dp = new int[n + 1];
        dp[0] = 0;
        for(int i = 1; i <= n; i++){
        	int j = 1;
        	int min = Integer.MAX_VALUE;
        	while(i - j * j >= 0){
        		min = Math.min(dp[i - j * j] + 1,min);
        		j++;
        	}
        	dp[i] = min;
        }
        return dp[n];
    }


Java Solution 2 

Java solution O(n^1/2) time and O(1) space

https://leetcode.com/discuss/57020/java-solution-o-n-1-2-time-and-o-1-space

https://en.wikipedia.org/wiki/Jacobi%27s_four-square_theorem


Solution 3 BFS

https://leetcode.com/discuss/58056/summary-of-different-solutions-bfs-static-and-mathematics

//BFS
	//https://leetcode.com/discuss/58056/summary-of-different-solutions-bfs-static-and-mathematics
	public static int numSquares3(int n) {
        List<Integer> squares = new ArrayList<Integer>();
        int[] countArray = new int[n + 1];
        for(int i = 1; i*i <= n; i++){
            squares.add(i * i);
            countArray[i *i - 1] = 1;
        }
        Queue<Integer> q = new LinkedList<Integer>();
        for(int i : squares){
            q.offer(i);
        }
        int step = 1;
        while(!q.isEmpty()){
        	step++;
        	int qSize = q.size();
        	for(int i = 0; i < qSize; i++){
        		int t = q.peek();
        		for(int j : squares){
        			if(t + j == n){
        				return step;
        			}else if((t + j < n) && (countArray[t + j - 1] == 0)){
        				countArray[t + j - 1] = step;
        				q.offer(t + j);
        			}else if(t + j > n){
        				break;
        			}
        		}
        		q.poll();
        	}
        }
        return 0;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值