【JAVA】每日两道算法题0927

LeetCode697 数组的度

题目:给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值。找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。

输入: [1,2,2,3,1,4,2]
输出: 6

  • 标签:数组

  • 思路:

  1. 根据题意,对于数组中的每一个值,需要存储:第一次出现的位置(即下标),最后一次出现的位置(即下标),出现的次数。所以选择哈希表来存储,key为数组中的每一个值,value存储下标或次数。
  2. 遍历数组
    第一次出现的位置:如果数组中的值不在left表的key中,即保存。
    最后一次出现的位置:在遍历数组过程中不断添加或者更新。map.put()函数会更新key一样的value.
    次数:集合中有这个key时,就使用这个key的value,没有就使用0。均+1
  3. 遍历count的key,找到count表中最大value,然后找到min(right[key]- left[key] +1)。(为什么不找最大value对应的key,因为这样的key可能不止一个)
  • 代码实现
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class Solution {
    private static int findShortestSubArray(int[] nums) {
    	//哈希表,left存储x和左下标,right存储x和右下标。count存储x和次数。
        Map<Integer, Integer> left = new HashMap(),
                right = new HashMap(), count = new HashMap();
        //循环一次,即可得到所有的目标哈希表     
        for (int i = 0; i < nums.length; i++) {
            int x = nums[i];
            if(!left.containsKey(x)) {left.put(x,i);}
            right.put(x,i);
            count.put(x, count.getOrDefault(x ,0) + 1);   //map集合中有这个key时,就使用这个key值,没有就使用0.均+1
        }
		
        int ans = nums.length;
        //获取count表中最大的value。count.values()是一个Collections对象。调用max函数。
        int degree = Collections.max(count.values());
        //循环count表,找到最大value对应的key。right[key]-left[key] +1即为长度。
        for (int x : count.keySet()) {
            if(count.get(x) == degree) {
                ans = Math.min(right.get(x) - left.get(x) +1, ans);
            }
        }
        return ans;
    }
    
	//测试用例
    public static void main(String[] args) {
        int[] nums = {1,3,5,6,3,5,7}; //3,5的度均为最大值2.比较min.
        int[] nums = {1,3,5,6,3,7,5};
        int minLen = findShortestSubArray(nums);
        System.out.println(minLen);
    }
}

LeetCode66 加一

题目:给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。

输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。

  • 标签:数组
  • 思路
  1. 特殊值:9。根据题意写出测试用例:9、29、92、99。
  2. 遍历数组时,从最后一位(个位)遍历。将第一个不是9的数+1返回。将遍历过的9位赋值为0。
  • 代码实现
public class PlusOne {
    private static int[] plusOne(int[] digits) {
        int n = digits.length;
        for (int i = n-1; i >= 0; i--) {
           if (digits[i] != 9) {
               digits[i]++;
               return digits;
           }
           digits[i] = 0;
        }
        int[] aims = new int[n+1];
        aims[0] = 1;
        return aims;
    }

    public static void main(String[] args) {
        //int[] a = {9,9,9}
        //int[] a = {2,9,9};
        //int[] a = {9,2};
        int[] a = {9};
        int[] b = plusOne(a);
        for (int i = 0; i < b.length; i++) {
            System.out.println(b[i]);
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值