哈希贪心——面试必刷TOP101

哈希/贪心

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;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值