力扣第60场双周赛

力扣第60场双周赛前两题

链接: 个人站点.
image-20210905151141628

开学时期,各种事务都很忙,但还是争取把各项事务有条不紊的处理好。

找到数组的中间位置

image-20210905151307100

解答此题,我们可以进行简单的循环,以一个下标作为分隔符,分别统计下标前后的整数总和再进行比较。

class Solution {
    public int findMiddleIndex(int[] nums) {
        if(nums.length == 1) return 0;
        int preSum = 0;//统计下标前的整数和
        for(int i = 0;i < nums.length;i++){
            int lastSum = 0;//统计下标后的整数和
            for(int j = i+1;j< nums.length;j++){
                lastSum = lastSum + nums[j];
            }
            if(preSum == lastSum) return i;
            preSum = preSum + nums[i];
        }
        return -1;
    }
}

找到所有的农场组

image-20210905161900309

image-20210905161953647

解答此题,容易思考到DFS思路:

  • 对每一点进行遍历,找出农场组点
  • 从这个农场组点进行dfs搜索,并标记。每次更新加入的点坐标(记录一个最小,一个最大的)
  • 将其(每次dfs记录下的最小与最大的点坐标值)加入一个列表中。
  • 将列表转为数组,返回。
class Solution {
    //dirs数组便于对方向进行控制
    public int[][] dirs={{1,0},{-1,0},{0,1},{0,-1}};
    public int[] c1;
    public int[] c2;
    public void dfs(int[][] land,int[] c1,int[] c2,int m,int n,int x,int y){
        land[x][y]=0;
        if(x<=c1[0]&&y<=c1[1]){
            c1[0]=x;
            c1[1]=y;
        }
        if(x>=c2[0]&&y>=c2[1]){
            c2[0]=x;
            c2[1]=y;
        }
        for(int[] dir:dirs){
            int xx=x+dir[0],yy=y+dir[1];
            if(xx>=0&&xx<m&&yy>=0&&yy<n&&land[xx][yy]==1){
                dfs(land,c1,c2,m,n,xx,yy);
            }
        }
    }
    public int[][] findFarmland(int[][] land) {
        List<int[]> res=new ArrayList<>();
        int m=land.length,n=land[0].length;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(land[i][j]==1){
                    c1=new int[]{i,j};
                    c2=new int[]{i,j};
                    dfs(land,c1,c2,m,n,i,j);
                    res.add(new int[]{c1[0],c1[1],c2[0],c2[1]});
                }
            }
        }
        //将列表转为数组
        int[][] ans=new int[res.size()][4];
        for(int i=0;i<res.size();i++){
            ans[i]=res.get(i);
        }
        return ans;
    }
}

笔者受时间限制,只做两题题解。


2021.09.05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值