leetcode刷题(四)java

10.分割数组

给定一个数组 A,将其划分为两个连续子数组 leftright, 使得:

  • left 中的每个元素都小于或等于 right 中的每个元素。
  • leftright 都是非空的。
  • left 的长度要尽可能小。

在完成这样的分组后返回 left长度。可以保证存在这样的划分方法。

class Solution {
    public int partitionDisjoint(int[] A) {
        int n=A.length;
        int[] ans=new int[n];
        ans[0]=1;
        int m=A[0],t=A[0];
        for(int i=1;i<n;i++)
        {
            if(A[i]<m)
            {
                ans[i]=i+1;
                m=t;
            }
            else
            {
                ans[i]=ans[i-1];
                if(A[i]>=t)
                {
                    t=A[i];
                }
            }
        }
        return ans[n-1];

    }
}

11.寻找中心下标

给你一个整数数组 nums,请编写一个能够返回数组 “中心下标” 的方法。

数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。

如果数组不存在中心下标,返回 -1 。如果数组有多个中心下标,应该返回最靠近左边的那一个。

**注意:**中心下标可能出现在数组的两端。

class Solution {
    public int pivotIndex(int[] nums) {
        int sum1=0,sum2=0;
        int n=nums.length;
        if(n==0)
        {
            return -1;
        }
        if(n==1)
        {
            return 0;
        }
        for(int i=1;i<n;i++)
        {
            sum2=sum2+nums[i];
        }
        if(sum1==sum2)
        {
            return 0;
        }
        for(int i=1;i<n;i++)
        {
            sum1=sum1+nums[i-1];
            sum2=sum2-nums[i];
            if(sum1==sum2)
            {
                return i;
            }
        }
        return -1;
        
    }
}

12.不同路径III

在二维网格 grid 上,有 4 种类型的方格:

  • 1 表示起始方格。且只有一个起始方格。
  • 2 表示结束方格,且只有一个结束方格。
  • 0 表示我们可以走过的空方格。
  • -1 表示我们无法跨越的障碍。

返回在四个方向(上、下、左、右)上行走时,从起始方格到结束方格的不同路径的数目**。**

每一个无障碍方格都要通过一次,但是一条路径中不能重复通过同一个方格

class Solution {
    
    public static int dps(int[][] grid,int i,int j,int m,int n,int s,int l)//i,j是当前位置
    {
        int ans=0;
        if(i<0||j<0||i>=m||j>=n||grid[i][j]==-1||grid[i][j]==1)
        {
            return 0;
        }
        else if(grid[i][j]==2)
        {
            if(s==l)
            {
                return 1;
            }
            else{
                return 0;
            }
        }
        else
        {
            if(grid[i][j]==0)
            {
                s=s+1;
                grid[i][j]=-1;
                ans=ans+dps(grid,i+1,j,m,n,s,l);
                ans=ans+dps(grid,i,j+1,m,n,s,l);
                ans=ans+dps(grid,i-1,j,m,n,s,l);
                ans=ans+dps(grid,i,j-1,m,n,s,l);
                grid[i][j]=0;
            }
        }
        return ans;
    }

    public int uniquePathsIII(int[][] grid) {
        int ans=0;
        int m=grid.length,n=grid[0].length;
        int l=0;
        int start_i=0,start_j=0;
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(grid[i][j]==1)
                {
                    start_i=i;
                    start_j=j;
                }
                if(grid[i][j]==0)
                {
                    l=l+1;
                }
            }
        }
        int i=start_i,j=start_j;
        int s=0;
        ans=ans+dps(grid,i+1,j,m,n,s,l);
        s=0;
        i=start_i;
        j=start_j;
        ans=ans+dps(grid,i,j+1,m,n,s,l);
        s=0;
        i=start_i;
        j=start_j;
        ans=ans+dps(grid,i-1,j,m,n,s,l);
        s=0;
        i=start_i;
        j=start_j;
        ans=ans+dps(grid,i,j-1,m,n,s,l);
        return ans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值