首页 > 其他分享 >LeetCode三则

LeetCode三则

时间:2024-04-15 23:11:38浏览次数:22  
标签:三则 index MAP int nums value key LeetCode

53. 最大子数组和

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组
是数组中的一个连续部分。

示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:
输入:nums = [1]
输出:1

示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
    /**
     * @author XiSoil
     * @date 2024/04/15 16:00
     *执行分布用时1ms,击败的100.00%Java用户
     *消耗内存分布55.54MB,击败的94.78%Java用户
     **/
    public int maxSubArray(int[] nums) {
        int maxSum = nums[0];
        int currentSum = nums[0];
        for (int i = 1; i < nums.length; i++) {
            currentSum = Math.max(nums[i], currentSum + nums[i]);
            maxSum = Math.max(maxSum, currentSum);
        }
        return maxSum;
    }
动态规划秒了
706. 设计哈希映射
不使用任何内建的哈希表库设计一个哈希映射(HashMap)。

实现 MyHashMap 类:

MyHashMap() 用空映射初始化对象
void put(int key, int value) 向 HashMap 插入一个键值对 (key, value) 。如果 key 已经存在于映射中,则更新其对应的值 value 。
int get(int key) 返回特定的 key 所映射的 value ;如果映射中不包含 key 的映射,返回 -1 。
void remove(key) 如果映射中存在 key 的映射,则移除 key 和它所对应的 value 。

示例:
输入:
["MyHashMap", "put", "put", "get", "get", "put", "get", "remove", "get"]
[[], [1, 1], [2, 2], [1], [3], [2, 1], [2], [2], [2]]
输出:
[null, null, null, 1, -1, null, 1, null, -1]

解释:
MyHashMap myHashMap = new MyHashMap();
myHashMap.put(1, 1); // myHashMap 现在为 [[1,1]]
myHashMap.put(2, 2); // myHashMap 现在为 [[1,1], [2,2]]
myHashMap.get(1); // 返回 1 ,myHashMap 现在为 [[1,1], [2,2]]
myHashMap.get(3); // 返回 -1(未找到),myHashMap 现在为 [[1,1], [2,2]]
myHashMap.put(2, 1); // myHashMap 现在为 [[1,1], [2,1]](更新已有的值)
myHashMap.get(2); // 返回 1 ,myHashMap 现在为 [[1,1], [2,1]]
myHashMap.remove(2); // 删除键为 2 的数据,myHashMap 现在为 [[1,1]]
myHashMap.get(2); // 返回 -1(未找到),myHashMap 现在为 [[1,1]]

提示:
0 <= key, value <= 10^6
最多调用 10^4 次 put、get 和 remove 方法
/**
     * @author XiSoil
     * @date 2024/04/15 15:24
     *执行分布用时139ms,击败的6.95%Java用户
     *消耗内存分布56.88MB,击败的5.00%Java用户
     **/
    class MyHashMap {
        int size = 65023;
        int length = 1701031;
        Integer[][] MAP;
        //第一个值用来存储keys,第二个值用来存储对应的values
        public int hash(int index){
            return index % size;
        }

        public MyHashMap() {
            MAP = new Integer[length][2];//最多进行10000次put操作,所以最多10000个key
        }

        public void put(int key, int value) {
            int index = hash(key);
            while(MAP[index][0] !=null){
                if (MAP[index][0] == key) {
                    MAP[index][1] = value;
                    return;
                }else {
                    index = (index+1) % size;
                }
            }
            MAP[index][0] = key;
            MAP[index][1] = value;
        }

        public int get(int key) {
            int index = hash(key);
            if (MAP[index][0] == null)
                return -1;
            //下标相等、且键也要相等才能判断为指向同一个key-value对
            if (MAP[index][0] == key)
                return MAP[index][1];
            else {
                index = (index + 1) % size;
                while (index != hash(key)) {
                    if (MAP[index][0] == null){
                        index = (index+1)%size;
                    }else if (MAP[index][0] == key) {
                        return MAP[index][1];
                    }
                    else {
                        index = (index + 1) % size;
                    }
                }
                return -1;
            }
        }

        public void remove(int key) {
            int index = hash(key);
            if (MAP[index][0] == null)
                return;
            if (MAP[index][0] == key) {
                MAP[index][0] = null;
                MAP[index][1] = null;
            } else {
                index = (index + 1) % size;
                while (index != hash(key)) {
                    if (MAP[index][0] == null){
                        index = (index+1)%size;
                    }else if (MAP[index][0] == key) {
                        MAP[index][0] = null;
                        MAP[index][1] = null;
                        return;
                    }else {
                        index = (index + 1) % size;
                    }
                }
            }
        }
    }
HashMap求解,空间和时间的开销都比较大
    /**
     * @author XiSoil
     * @date 2024/04/15 15:51
     *执行分布用时18ms,击败的73.99%Java用户
     *消耗内存分布46.81MB,击败的61.39%Java用户
     **/
    class MyHashMap {
        private class Pair {
            private int key;
            private int value;

            public Pair(int key, int value) {
                this.key = key;
                this.value = value;
            }

            public int getKey() {
                return key;
            }

            public int getValue() {
                return value;
            }

            public void setValue(int value) {
                this.value = value;
            }
//            public void setKey(int key){
//                this.key = key;
//            }
        }

        private final int BASE = 769;
        private LinkedList[] data;

        public int hash(int key) {
            return key % BASE;
        }

        public MyHashMap() {
            data = new LinkedList[BASE];
            for (int i = 0; i < BASE; i++) {
                data[i] = new LinkedList<>();
            }
            //初始化一个新的链表数组,并将每个链表都初始化为空链表
        }

        public void put(int key, int value) {
            int index = hash(key);
            //获取data[index]链表的迭代器
            Iterator<Pair> iterator = data[index].iterator();
            //遍历链表,如果存在key相同的Pair,则更新value,否则添加新的Pair
            while (iterator.hasNext()) {
                Pair pair = iterator.next();
                if (pair.getKey() == key) {
                    pair.setValue(value);
                    return;
                }
            }
            //data[index].addLast(new Pair(key, value));
            data[index].offerLast(new Pair(key, value));
        }

        public int get(int key) {
            int index = hash(key);
            Iterator<Pair> iterator = data[index].iterator();
            while (iterator.hasNext()) {
                Pair pair = iterator.next();
                if (pair.getKey() == key) {
                    return pair.getValue();
                }
            }
            return -1;
        }

        public void remove(int key){
            int index = hash(key);
            Iterator<Pair> iterator = data[index].iterator();
            while(iterator.hasNext()){
                Pair pair = iterator.next();
                if(pair.getKey() == key){
                    data[index].remove(pair);
                    return;
                }
            }
        }
    }
HashMap结合LinkList节省了空间
2216. 美化数组的最少删除数
给你一个下标从 0 开始的整数数组 nums ,如果满足下述条件,则认为数组 nums 是一个 美丽数组 :

nums.length 为偶数
对所有满足 i % 2 == 0 的下标 i ,nums[i] != nums[i + 1] 均成立
注意,空数组同样认为是美丽数组。

你可以从 nums 中删除任意数量的元素。当你删除一个元素时,被删除元素右侧的所有元素将会向左移动一个单位以填补空缺,而左侧的元素将会保持 不变 。

返回使 nums 变为美丽数组所需删除的 最少 元素数目。
    public int minDeletion(int[] nums) {
        int len = nums.length;
        if (len == 0) {
            return 0;
        }
        if (len == 1) {
            return 1;
        }
        int count = 0;
        int right = 0;
        int left = 1;
        for (; left < len; ) {
            if (nums[right] == nums[left]){
                left++;
                count++;
            }else {
                right = left+1;
                left = right+1;
            }
        }
        if ((len-count)%2 == 1)
            count++;
        return count;
    }
双指针+贪心

 

标签:三则,index,MAP,int,nums,value,key,LeetCode
From: https://www.cnblogs.com/xxaxf/p/18137151

相关文章

  • leetcode插件问题
    1.使用一段时间后,提交答案一直返回undefind原因为插件缓存token有效期已过,需要重新登录2.重新登录......
  • 2321. 拼接数组的最大分数(leetcode)
    https://leetcode.cn/problems/maximum-score-of-spliced-array/description/这一题应该算一个连续最大子数组思维题,要点是根据差数组去做,然后求最值classSolution{public:intmaximumsSplicedArray(vector<int>&nums1,vector<int>&nums2){//f[i]表示以......
  • LeetCode 面试经典150题---006
    玩了一天多,两天没写了,下次绝对不摆了(最多摆一天)。####42.接雨水给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。n==height.length1<=n<=2*1040<=height[i]<=105不用头想都知道这个题肯定只能用线性复杂度做,至于怎......
  • LeetCode三则
    1.给定两个大小分别为m和n的正序(从小到大)数组nums1和nums2。请你找出并返回这两个正序数组的中位数。算法的时间复杂度应该为O(log(m+n))。示例1:输入:nums1=[1,3],nums2=[2]输出:2.00000解释:合并数组=[1,2,3],中位数2示例2:输入:nums1=[1,2],nums2=[3,......
  • LeetCode四则
    1.给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例1:输入:nums=[2,7,11,15],targ......
  • 最长递增子序列leetcode的总结
    使用动态规划解决,首先明白dp数组的含义dp[i]表示在位置i时最长的递增子序列dp[i]=max(dp[j]+1,dp[i])为递推公式初始化dp[i]=1都初始化为1因为最基本的每一个位置至少为一个遍历顺序for(inti=2;i<len;i++){            for(intj=0;j<i;j++){if(n......
  • 算法训练营Day08-LeetCode344. 反转字符串 && 541. 反转字符串 II && 151. 反转字符串
    344.反转字符串题目链接:LeetCode344.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题思路:字符串首尾字符交换即可完成反转。定......
  • LeetCode 2439. 最小化数组中的最大值
    给你一个下标从 0 开始的数组 nums ,它含有 n 个非负整数。每一步操作中,你需要:选择一个满足 1<=i<n 的整数 i ,且 nums[i]>0 。将 nums[i] 减1。将 nums[i-1] 加1。你可以对数组执行 任意 次上述操作,请你返回可以得到的 nums 数组中 最大值......
  • LeetCode 1760. 袋子里最少数目的球
    给你一个整数数组 nums ,其中 nums[i] 表示第 i 个袋子里球的数目。同时给你一个整数 maxOperations 。你可以进行如下操作至多 maxOperations 次:选择任意一个袋子,并将袋子里的球分到 2个新的袋子中,每个袋子里都有 正整数 个球。比方说,一个袋子里有 5 个......
  • LeetCode 面试经典150题---005
    ####135.分发糖果n个孩子站成一排。给你一个整数数组ratings表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果:每个孩子至少分配到1个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。请你给每个孩子分发糖果,计算并返回需要准备的最少糖果数目。n==rat......