力扣第60场双周赛前两题
链接: 个人站点.
开学时期,各种事务都很忙,但还是争取把各项事务有条不紊的处理好。
找到数组的中间位置
解答此题,我们可以进行简单的循环,以一个下标作为分隔符,分别统计下标前后的整数总和再进行比较。
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;
}
}
找到所有的农场组
解答此题,容易思考到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;
}
}
笔者受时间限制,只做两题题解。