4.23笔试

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()]); // ✅ 正确

解决方法

  1. 手动填充
  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;
  1. 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背包解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值