题目详情见官网
为什么又把它捞出来了呢?因为 广联达开发的暑期实习笔试 今天考了这个原题,只是背景不同,让我们温故而知新吧。
思维导图攻破算法难题
算法思路视频讲解请点击——> b站鲁班代师讲解视频
视频中附有C++源码,本博客提供Java代码,算法思路完全一致。
更多精彩视频(Letecode笔试高频题、互联网大厂笔试刷题)请在bilibili搜索鲁班代师,然后搜索题号就可以,关注不走丢,感谢。
欢迎批评指正、探讨!
import java.util.Arrays;
import java.util.Scanner;
class Solution
{
//判断是否可以构成正方行
public boolean makesquare(int[] nums)
{
//简单判断条件
if(nums.length < 4)
{
//数组长度小于4
return false;
}
int sum = 0;
for(int i = 0; i < nums.length; i++)
{
sum += nums[i];
}
if(sum % 4 != 0)
{
//数组数值总和不能被4整除
return false;
}
// 将数组降序排列(c++比较容易实现,java需要自己重写Comparator的compare方法),后面附上了重写的具体方法,此处暂用升序,回头从最后一个元素开始调用
Arrays.sort(nums);
int edge[] = new int[]{0, 0, 0, 0};//四个边的初始数组
return generate(nums.length-1, nums,sum/4, edge);
}
//迭代函数,递归回溯的放置每个钢筋,第i次递归,即把arr[i]放到合适的边上
public boolean generate(int i, int[] arr, int target, int[] edge)
{
//终止条件
if(i < 0)
{
return edge[0] == target && edge[1] == target && edge[2] == target && edge[3] == target;
}
for(int j = 0; j < 4; j++)
{
if(edge[j] + arr[i] > target)
{
//尝试吧arr[i]这个钢筋放到下一个边上,跳过本次循环
continue;
}
edge[j] += arr[i];
//继续迭代,判断经过当前放置之后,是否全放完了
if(generate(i-1, arr, target, edge))
{
//全放完了,且满足条件
return true;
}
//回溯,刚才放的,再取出来,从新将arr[i]放置到新的边,直到4个边都尝试结束
edge[j] -= arr[i];
}
//都尝试过了,还没有return,说明无法拼成
return false;
}
}
Java实现自带sort的数组降序排列代码
public class Main
{
public static void main(String[] args)
{
//读入arr数组,此处省略
decreaseCompare cmp = new decreaseCompare();
Arrays.sort(arr, cmp);
}
}
class decreaseCompare implements Comparator<Integer>
{
@Override
public int compare(Integer a, Integer b)
{
return a > b ? -1 : 1;
}
}