279. 完全平方数(中等)

本文探讨了两种解决整数平方数分解问题的方法:广度优先搜索(BFS)队列策略和动态规划(DP)算法。通过实例展示了如何利用这两种技术来寻找最少平方数组合,以及它们在代码实现中的区别和优化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:

方法一:使用广度优先,设置一个队列、一个记录表

方法二:动态规划dp

 

代码:

方法一:

class Solution {
    public int numSquares(int n) {
		if(n==0||n==1) return n;
		
		//创建队列
		Queue<Integer> queue=new LinkedList<>();
		queue.offer(n);
		
		//visited
		boolean[] visited=new boolean[n];
		
		int step=1;
		
		while(!queue.isEmpty()){
			int size=queue.size();
			for(int i=0;i<size;i++){
				int cur=queue.poll();
				for(int k=1;k*k<=cur;k++){
					if(k*k==cur){
						//只有相等时才返回
						return step;
					}
					int next=cur-k*k;
					if(!visited[next]){
						queue.offer(next);
						visited[next]=true;
					}
				}
			}
			step++;
		}
		//return step;
		throw new IllegalArgumentException("参数错误");
    }
   
}

方法二:

class Solution {
    public int numSquares(int n) {
		if(n==0||n==1){
			return 1;
		}
		int[] dp=new int[n+1];
		
		//从1开始,下标代表数值
		for(int i=1;i<=n;i++){
			//初始化
			dp[i]=i;
			for(int k=1;i-k*k>=0;k++){
			//每次都是i-k*k,如果<=0,则表示该平方数符合
			//因为该数比前一个数大,所以肯定是在前一个数的基础上要+1
				dp[i]=Math.min(dp[i],dp[i-k*k]+1);
			}
		}
		return dp[n];
	}
}

 

分解:

1)广度优先的固定模式:

Queue<Integer> queue=new LinkedList<>();
queue.offer(n);

boolean[] visited=new boolean[n];
int step=1;

while(!queue.isEmpty()){
    int size=queue.size();
    for(int i=0;i<size;i++){
        int cur=queue.poll();
           ...
        int next=xxx;
        if(!visited[next]){
            queue.offer(next);
            visited[next]=true;
        }
    }
}
		

2)注意:

    i)每次出队列之前,都记录一下这次队列中有多少个元素

    ii)改变了当前元素后,判断是否访问过,若无,则1)加入队列  2)设置为访问

 

3)方法二:

    i)初始化:从1开始,下标代表数值

    ii)每次都是i-k*k,如果<=0,则表示该平方数符合

因为该数比前一个数大,所以肯定是在前一个数的基础上dp+1
              

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值