LeetCode第212场周赛【前三题题解】(2020/10/25)

第一题
1629. 按键持续时间最长的键
eclipse代码:

package leetcode;

import java.util.ArrayList;
import java.util.Arrays;

public class _01_5546
{

	public static void main(String[] args)
	{
		// TODO Auto-generated method stub
		int[] re = {9,29,49,50};String keys = "cbcd";
		int max=re[0]-0;ArrayList<Character> array=new ArrayList<Character>();
		for(int i=1;i<re.length;i++) {
			max=Math.max(re[i]-re[i-1], max);
		}
		if(max==re[0]-0)array.add(keys.charAt(0));
		for(int i=1;i<re.length;i++) {
			if(re[i]-re[i-1]==max)
				array.add(keys.charAt(i));
		}
		System.out.println(array.get(array.size()-1));
	}

}

leetcode代码:

class Solution {
    public char slowestKey(int[] re, String keys) {
        int max=re[0]-0;
        ArrayList<Character> array=new ArrayList<Character>();
		for(int i=1;i<re.length;i++) {
			max=Math.max(re[i]-re[i-1], max);
		}
		if(max==re[0]-0)array.add(keys.charAt(0));
		for(int i=1;i<re.length;i++) {
			if(re[i]-re[i-1]==max)
				array.add(keys.charAt(i));
		}
        return array.get(array.size()-1);
    }
}

第二题
1630. 等差子数组

eclipse代码:

package leetcode;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class _02_5547
{

	public static void main(String[] args)
	{
		// TODO Auto-generated method stub
		int[] nums = {4,6,5,9,3,7};
		int[] l = {0,0,2};
		int[] r = {2,3,5};
		List<Boolean> check=new ArrayList<Boolean>();
		int size=0;
		while(size<l.length) {
			if(r[size]==l[size]) {
				check.add(true);
				break;
			}
			int[] help=new int [r[size]-l[size]+1];
			int f=0;
			for(int i=l[size];i<=r[size];i++) 
				{help[f++]=nums[i];}
			Arrays.sort(help);
			System.out.println(Arrays.toString(help));
			int d=help[1]-help[0];//公差
			boolean yes=true;
			for(int i=1;i<help.length;i++) {
				if(help[i]-help[i-1]!=d) {
					{yes=false;
					break;
					}
				}
			}
				if(yes)check.add(true);
				else
					check.add(false);
			size++;
		}
		System.out.println(check);
	}
}

leetcode代码:

class Solution {
    public List<Boolean> checkArithmeticSubarrays(int[] nums, int[] l, int[] r) {
        
        List<Boolean> check=new ArrayList<Boolean>();
		int size=0;
		while(size<l.length) {
			if(r[size]==l[size]) {
				check.add(true);
				break;
			}
			int[] help=new int [r[size]-l[size]+1];
			int f=0;
			for(int i=l[size];i<=r[size];i++) 
				{help[f++]=nums[i];}
			Arrays.sort(help);
			System.out.println(Arrays.toString(help));
			int d=help[1]-help[0];//公差
			boolean yes=true;
			for(int i=1;i<help.length;i++) {
				if(help[i]-help[i-1]!=d) {
					{yes=false;
					break;
					}
				}
			}
				if(yes)check.add(true);
				else
					check.add(false);
			size++;
		}
        return check;
    }
}

第三题
1631 最小体力消耗路径
二分查找+bfs
eclipse代码:

package leetcode;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

public class _03_5548
{
	private static class Job {
		int x;
		int y;
		public Job(int x,int y) {
			this.x=x;
			this.y=y;
		}
	}
	static int max;
//	[1,2,3],[3,8,4],[5,3,5]    答案为:1
	public static void main(String [] args) {
		int heights[][] = {{1,2,3},{3,8,4},{5,3,5}};
		int left=0;int right=999999;//right的值一定要足够大才行
		int m=heights.length;
		int n=heights[0].length;
		int[] dx= {1,0,-1,0};
		int[] dy= {0,1,0,-1};
		while(left<=right) {//采用二分查找的方法【小于等于】
			int mid=(left+right)/2;//先限定一个mid值(加一个限定条件)
			int[][] biaoji=new int[m][n];
			Queue<Job> q=new LinkedList<Job>();
			q.add(new Job(0,0));
			while(q.size()!=0) {
				Job job=q.poll();
//				biaoji[job.x][job.y]=1;
				for(int i=0;i<4;i++) {
					int nx=job.x+dx[i];
					int ny=job.y+dy[i];
					if(nx>=0&&nx<m&&ny>=0&&ny<n&&biaoji[nx][ny]==0
							&&Math.abs(heights[nx][ny]-heights[job.x][job.y])<=mid) {//满足限定条件才能加入队列
						q.add(new Job(nx,ny));
						biaoji[nx][ny]=1;
					}
				}
			}
			if(biaoji[m-1][n-1]==1){//限定条件mid的值可能太大了
				max=mid;
				right=mid-1;
			}
			else//限定的mid值太小了,最后都到不了终点
				left=mid+1;
		}
		System.out.println(max);
	}
}

leetcode代码:

class Solution {
    public int minimumEffortPath(int[][] heights) {
        int max=0;
        int left=0;int right=999999;//right的值一定要足够大才行
		int m=heights.length;
		int n=heights[0].length;
		int[] dx= {1,0,-1,0};
		int[] dy= {0,1,0,-1};
		while(left<=right) {//采用二分查找的方法
			int mid=(left+right)/2;//先限定一个mid值(加一个限定条件)
			int[][] biaoji=new int[m][n];
			Queue<Job> q=new LinkedList<Job>();
			q.add(new Job(0,0));
			while(q.size()!=0) {
				Job job=q.poll();
//				biaoji[job.x][job.y]=1;
				for(int i=0;i<4;i++) {
					int nx=job.x+dx[i];
					int ny=job.y+dy[i];
					if(nx>=0&&nx<m&&ny>=0&&ny<n&&biaoji[nx][ny]==0
							&&Math.abs(heights[nx][ny]-heights[job.x][job.y])<=mid) {//满足限定条件才能加入队列
						q.add(new Job(nx,ny));
						biaoji[nx][ny]=1;
					}
				}
			}
			if(biaoji[m-1][n-1]==1){//限定条件mid的值可能太大了
				max=mid;
				right=mid-1;
			}
			else//限定的mid值太小了,最后都到不了终点
				left=mid+1;
		}
        return max;
    }
}


    class Job {
		int x;
		int y;
		public Job(int x,int y) {
			this.x=x;
			this.y=y;
		}
	}

以上是我自己想出来的解法,现阶段的能力也就三题了。
leetcode可以修改变量名,但是不能修改原始题目的方法名,会报错的。
欢迎指教,一起进步呀!
才疏学浅,还请不吝赐教~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值