哈希/贪心
BM92 最长无重复子数组(子数组是连续的)
import java.util.*;
public class Solution {
public int maxLength (int[] arr) {
Map<Integer, Integer> map = new HashMap<>();
int i = -1, res = 0;
for(int j = 0; j < arr.length; j++) {
if(map.containsKey(arr[j]))
i = Math.max(i, map.get(arr[j])); // 更新左指针 i
map.put(arr[j], j); // 哈希表记录
res = Math.max(res, j - i); // 更新结果
}
return res;
}
}
BM50 两数之和
import java.util.*;
public class Solution {
public int[] twoSum (int[] nums, int tar) {
HashMap<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++){
if(map.containsKey(tar-nums[i]))
return map.get(tar-nums[i])>i?
new int[]{i+1,map.get(tar-nums[i])+1}:new int[]{map.get(tar-nums[i])+1,i+1};
map.put(nums[i],i);
}
return new int[0];
}
}
BM51 数组中出现次数超过一半的数字
public class Solution {
public int MoreThanHalfNum_Solution(int [] nums) {
int x=0,votes=0;
for(int num:nums){
if(votes==0) x=num;
votes+=num==x?1:-1;
}
return x;
}
}
BM52 数组中只出现一次的两个数字
import java.util.*;
public class Solution {
public int[] FindNumsAppearOnce (int[] nums) {
int res=0;
for(int num:nums){
res=res^num;
}
int m=1;
while((res & m)==0){
m<<=1;
}
int x=0;
int y=0;
for(int num:nums){
if((num & m)!=0) x^=num;
else y^=num;
}
return x<y?new int[]{x,y}:new int[]{y,x};
}
}
BM53 缺失的第一个正整数
import java.util.*;
public class Solution {
public int minNumberDisappeared (int[] nums) {
for(int i=0;i<nums.length;i++){
while(nums[i]>0 && nums[i]<=nums.length && nums[i]!=nums[nums[i]-1]){
swap(nums,i,nums[i]-1);
}
}
for(int i=0;i<nums.length;i++){
if(nums[i]!=i+1) return i+1;
}
return nums.length+1;
}
private void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}
BM54 三数之和(双指针)
import java.util.*;
public class Solution {
ArrayList<ArrayList<Integer>> res=new ArrayList<>();
public ArrayList<ArrayList<Integer>> threeSum(int[] nums) {
if(nums==null||nums.length<3) return res;
Arrays.sort(nums);
for(int i=0;i<nums.length;i++){
if(nums[i]>0) break;
if(i>0&&nums[i]==nums[i-1]) continue;
int L=i+1,R=nums.length-1;
while(L<R){
int sum=nums[i]+nums[L]+nums[R];
if(sum==0){
ArrayList<Integer> path=new ArrayList<>();
path.add(nums[i]);
path.add(nums[L]);
path.add(nums[R]);
res.add(path);
while(L<R&&nums[L]==nums[L+1]) L++;
while(L<R&&nums[R]==nums[R-1]) R--;
L++;
R--;
}
else if(sum<0) L++;
else if(sum>0) R--;
}
}
return res;
}
}
BM95 分糖果问题
import java.util.*;
public class Solution {
public int candy(int[] arr) {
int[] left = new int[arr.length];
int[] right = new int[arr.length];
Arrays.fill(left, 1);//先给每个学生 1 颗糖
Arrays.fill(right, 1);//先给每个学生 1 颗糖
for(int i = 1; i < arr.length; i++)
if(arr[i] > arr[i - 1]) left[i] = left[i - 1] + 1;
int count = left[arr.length - 1];
for(int i = arr.length - 2; i >= 0; i--) {
if(arr[i] > arr[i + 1]) right[i] = right[i + 1] + 1;
count += Math.max(left[i], right[i]);
}
return count;
}
}
BM96 主持人调度(二)
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 计算成功举办活动需要多少名主持人
* @param n int整型 有n个活动
* @param startEnd int整型二维数组 startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间
* @return int整型
*/
public int minmumNumberOfHost (int n, int[][] startEnd) {
//初始化两个数组,分别记录开始时间和结束时间
int[] start=new int[n];
int[] end=new int[n];
//将活动的开始和结束时间赋值道start和end数组
for(int i=0;i<n;i++){
start[i]=startEnd[i][0];
end[i]=startEnd[i][1];
}
//按从小到大的顺序对start和end数组排序
Arrays.sort(start);
Arrays.sort(end);
int res=0;
int index=0;
for(int i=0;i<n;i++){
//判断当前开始时间是否大于等于最小的结束时间
//如果是,说明当前主持人可以搞定
if(start[i]>=end[index])index++;
//否则,需要新增主持人
else res++;
}
return res;
}
}
分糖果
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int T=sc.nextInt();
while(T-->0){
int n=sc.nextInt();
int[] nums=new int[n];
for(int i=0;i<n;i++){
nums[i]=sc.nextInt();
}
//int sum=0;
int count2=0,count3=0;
for(int i=0;i<nums.length;i++){
//sum+=nums[i];
if(nums[i]==2) count2++;
else if(nums[i]==3) count3++;
}
//if(sum % 3!=0) return false;
if(count3 == 1) System.out.println("NO");
else if(count3 % 3==0 && count2 % 3==0) System.out.println("Yes");
else if(count3 % 3==1 && count2 % 3==0 && count2>=3) System.out.println("Yes");
else if(count3 % 3==2 && count2 % 3==0 && count2>=6) System.out.println("Yes");
else System.out.println("NO");
//if(count3 % 3==0) return count2 % 3==0;
//if(count3 % 3==1) return count2 % 3==0 && count2>=3;
//if(count3 % 3==2) return count2 % 3==0 && count2>=6;
}
}
}