1.如何应对返回值类型为int[][]的方法
使用 List<List> res=new ArrayList<>()存储数据,最后要返回一个int[][]类型
首先,用toArray()
方法,行不通
toArray() 无法直接转换为基本类型数组(如 int[]),因为泛型不支持基本类型
方法正确使用
-
(1) 传入 new T[0](推荐)
java
String[] arr = list.toArray(new String[0]); // ✅ 正确
✅ 优点:- Java 6+ 优化了 new T[0] 的性能,与 new T[list.size()] 几乎无差别。
- 代码更简洁。
-
(2) 传入 new T[list.size()]
String[] arr = list.toArray(new String[list.size()]); // ✅ 正确
解决方法
- 手动填充
int[][] arrs= new int[res.size()][];
for(int i=0;i<arrs.length;i++){
List<Integer> list=res.get(i);
arrs[i]=new int[list.size()];
int k=0;
for (Integer num : list) {
arrs[i][k++]=num;
}
}
return arrs;
- Lambda表达式
int[][] arrs= res.stream()
.map(l->l.stream()
.mapToInt(Integer::intValue)
.toArray())
.toArray(int[][]::new);
return arrs;
2. 划分数组
如 698. 划分为k个相等的子集
本质上使用回溯,通过剪枝,降低时间复杂度
例如:
[1,3,4,2,5] 3
tn(0<=n<k)代表分割的子数组
1 t0 t1 t2
3 t0 t1 t2
4 t0 t1 t2
2 t0 t1 t2
5 t0 t1 t2
从上到下递归装入子数组
class Solution {
public boolean canPartitionKSubsets(int[] nums, int k) {
int target=0;
for(int num:nums)
target+=num;
if(target%k!=0)
return false;
target=target/k;
//降序排列
Arrays.sort(nums);
reverse(nums);
return backtracking(nums,0,new int[k],target);
}
private boolean backtracking(int[] nums,int index,int[] sums,int target){
if(index==nums.length){
// for(int sum:sums){
// if(sum!=target)
// return false;
// }
return true;
}
for(int i=0;i<sums.length;i++){
//跳过一样的桶,因为与前一个效果相同
if(i>0&&sums[i-1]==sums[i])
continue;
//配合降序排列剪枝,
if(sums[i]+nums[index]>target)
continue;
sums[i]+=nums[index];
//下一个球选盒子
if(backtracking(nums,index+1,sums,target))
return true;
sums[i]-=nums[index];
}
return false;
}
private void reverse(int[] nums){
int l=0,r=nums.length-1;
while(r>l){
int t=nums[l];
nums[l]=nums[r];
nums[r]=t;
r--;
l++;
}
}
}
473. 火柴拼正方形
同样解法,将k改为4
LCR 101. 分割等和子集
该解法可解,但可能超时
01背包解决