草庐IT

LeetCode刷题第七周

noviceprogrammeroo 2023-04-17 原文

贪心算法

刷题或者面试的时候,手动模拟一下感觉可以局部最优推出整体最优,而且想不到反例,那么就试一试贪心。
455、分发饼干

class Solution {
    public int count;
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        count = 0;
        int indexS = 0;
        int indexG = 0;
        while(indexS < s.length && indexG < g.length){
            if(s[indexS] >= g[indexG]){
                count++;
                indexG++;
                indexS++;
            }else{
                indexS++;
            }
        }
        return count;
    }
}

376、摆动序列

class Solution {
    public int wiggleMaxLength(int[] nums) {
        if(nums.length <= 1){
            return nums.length;
        }
        int pre = 0;
        int cur = 0;
        int count = 1;
        for(int i = 1; i < nums.length; i++){
            cur = nums[i] - nums[i - 1];
            if((cur > 0 && pre <= 0) || (cur < 0 && pre >= 0)){
                count++;
                pre = cur;
            }        
        }
        return count;
    }
}

53、最大子数组和

class Solution {
    public int maxSubArray(int[] nums) {
        if(nums.length == 1){
            return nums[0];
        }
        int count = 0;
        int sum = Integer.MIN_VALUE;
        for(int i = 0; i < nums.length; i++){
            count += nums[i];
            sum = Math.max(sum, count);
            if(count <= 0){
                count = 0;
            }
        }
        return sum;
    }
}

122、买卖股票的最佳时机 II

class Solution {
    public int maxProfit(int[] prices) {
        int max = 0;
        for(int i = 1; i < prices.length; i++){
            if(prices[i] > prices[i - 1]){
                max += prices[i] - prices[i - 1];
            }
        }
        return max;
    }
}

55、跳跃游戏

class Solution {
    public boolean canJump(int[] nums) {
        if(nums.length == 1){
            return true;
        }
        int coverMax = 0;
        for(int i = 0; i <= coverMax; i++){//防止中途就出现覆盖范围中断
            coverMax = Math.max(coverMax, i + nums[i]);
            if(coverMax >= nums.length - 1){
                return true;
            }
        }
        return false;
    }
}

45、跳跃游戏 II

class Solution {
    public int jump(int[] nums) {
        int count = 0;
        if(nums.length == 1){
            return count;
        }
        // 当前覆盖范围
        int coverMax = 0;
        // 最大覆盖范围
        int maxCover = 0;
        for(int i = 0; i < nums.length; i++){
            // 更新在当前覆盖范围内的最大覆盖范围(下一步可以跳到的最大范围)
            maxCover = Math.max(nums[i] + i, maxCover);
            // 再跳一步就可以到达
            if(maxCover >= nums.length - 1){
                count++;
                break;
            }
            // 到达当前覆盖范围最大值,需要下一跳
            if(i == coverMax){
                count++;
                coverMax = maxCover;
            }
        }
        return count;
    }
}

1005、K 次取反后最大化的数组和

class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {
        Arrays.sort(nums);
        int index = 0;
        for(int i = 0; i < k; i++){
            if(i < nums.length - 1 && nums[index] < 0){
                nums[index] = -nums[index];
                if(nums[index] >= Math.abs(nums[index + 1])){
                    index++;
                }
                continue;
            }
            nums[index] = -nums[index];
        }
        int sum = 0;
        for(int j = 0; j < nums.length; j++){
            sum += nums[j];
        }
        return sum;
    }
}

134、加油站

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int[] arr = new int[gas.length];
        int sum = 0;
        int curSum = 0;
        int index = 0;
        for(int i = 0; i < arr.length; i++){
            arr[i] = gas[i] - cost[i];
            sum += arr[i];
            curSum += arr[i];
            if(curSum < 0){
                index = (i + 1)%arr.length;
                curSum = 0;
            }
        }
        if(sum >= 0){
            return index;
        }else{
            return -1;
        }
    }
}

135、分发糖果

class Solution {
    public int candy(int[] ratings) {
       // 最少糖果数目
       int[] arrResult = new int[ratings.length];
       arrResult[0] = 1;
        for(int i = 1; i < ratings.length; i++){
            arrResult[i] = ratings[i] > ratings[i - 1] ? arrResult[i - 1] + 1 : 1;
        }
        for(int i = ratings.length - 2; i >= 0; i--){
            if(ratings[i] > ratings[i + 1]){
                arrResult[i] =  Math.max(arrResult[i],arrResult[i + 1] + 1);
            } 
        }
        int sum = 0;
        for(int j = 0; j < arrResult.length; j++){
            sum += arrResult[j];
        }
        return sum;
    }
}

860、柠檬水找零

class Solution {
    public boolean lemonadeChange(int[] bills) {
        if(bills[0] != 5){
            return false;
        }
        if(bills.length == 1){
            return true;
        }
        List<Integer> money = new LinkedList<>();
        money.add(5);
        for(int i = 1; i < bills.length; i++){
            if(bills[i] == 5){
                money.add(5);
            }else if(bills[i] == 10){
                if(!money.contains(5)){
                    return false;
                }
                money.add(10);
                money.remove(new Integer(5));
            }else if(bills[i] == 20){
                if(money.contains(5) && money.contains(10)){
                    money.add(20);
                    money.remove(new Integer(5));
                    money.remove(new Integer(10));
                }else if(money.contains(5)){
                    for(int j = 0; j < 3; j++){
                        if(!money.contains(5)){
                            return false;
                        }
                        money.remove(new Integer(5));
                    }
                    money.add(20);
                }else{
                    return false;
                }
            }
        }
        return true;
    }
}

406、根据身高重建队列

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people,(a,b)->{//对数组进行排序
            if(a[0]==b[0]) return a[1] - b[1];
            return b[0] - a[0];
        });
        List<int[]> queue = new LinkedList<>();
        for(int[] p: people){
            queue.add(p[1],p);
        }
        return queue.toArray(new int[people.length][]);
    }
}

452、用最少数量的箭引爆气球

class Solution {
    public int findMinArrowShots(int[][] points) {
        Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));
        int count = 1;
        for(int i = 1; i < points.length; i++){
            if(points[i][0] > points[i-1][1]){
                count++;
            }else{
                points[i][1] = Math.min(points[i-1][1],points[i][1]);
            }
        }
        return count;
    }
}

435、 无重叠区间

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals,(a,b)->{
            if(a[0]==b[0])return a[1]-b[1];
            return a[0]-b[0];
        });
        int resultCount = 0;
        int right = intervals[0][1];
        for(int i = 1; i < intervals.length; i++){
            if(intervals[i][0] < right){
                resultCount++;
                if(intervals[i][1] < right){
                    right = intervals[i][1];
                }
            }else{
                right = intervals[i][1];
            }
        }
        return resultCount;
    }
}

763、划分字母区间

class Solution {
    public List<Integer> partitionLabels(String s) {
        List<Integer> list = new ArrayList<>();
        char[] arr = s.toCharArray();
        int index = 0;
        int start = 0;
        int left = 0;
        int right = arr.length - 1;
        while(start<arr.length){
            while(left <= index){
                if(arr[left] != arr[right]){
                    // left++;
                    right--;
                }else{
                    index = Math.max(index,right);
                    left++;
                    right = arr.length-1;
                }
            }
            list.add(index-start+1);
            index=index+1;
            start=index;
            left=index;
            right = arr.length-1;
        }
        return list;
        
    }
}

56、合并区间

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals,(a,b)->{
            if(a[0]==b[0])return a[1]-b[1];
                return a[0]-b[0];
        });
        List<int[]> result = new LinkedList<>();
        int right = intervals[0][1];
        int left = intervals[0][0];
        int count = 1;
        for(int i = 1; i < intervals.length; i++){
            if(intervals[i][0]<=right){
                right = Math.max(right,intervals[i][1]);
            }else{
                result.add(new int[]{left,right});
                left=intervals[i][0];
                right=intervals[i][1];
                count++;
            }
        }
        result.add(new int[]{left,right});
        return result.toArray(new int[count][]);
    }
}

738、单调递增的数字

class Solution {
    public int monotoneIncreasingDigits(int n) {
        String str = String.valueOf(n);
        char[] arr = str.toCharArray();
        int start = arr.length;
        for(int i = arr.length - 2; i >= 0; i--){
            if(arr[i] > arr[i+1]){
                arr[i]--;//字符减一的方法
                start = i+1;
            }
        }
        for(int j = start; j<arr.length; j++){
            arr[j]='9';
        }
        return Integer.parseInt(String.valueOf(arr));
    }
}

714、买卖股票的最佳时机含手续费

class Solution {
    public int maxProfit(int[] prices, int fee) {
        if(prices.length==1){
            return 0;
        }
        int index = prices[0]+fee;
        int sum=0;
        for(int i = 1; i < prices.length; i++){
            if(prices[i]>index){
                sum+=prices[i]-index;
                index=prices[i];
            }else if(prices[i]+fee<index){
                index=prices[i]+fee;
            }
        }
        return sum;
    }
}

968、监控二叉树

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int  res=0;
    public int minCameraCover(TreeNode root) {
        // 对根节点的状态做检验,防止根节点是无覆盖状态 .
        if(minCame(root)==0){
            res++;
        }
        return res;
    }
    /**
     节点的状态值:
       0 表示无覆盖 
       1 表示 有摄像头
       2 表示有覆盖 
    后序遍历,根据左右节点的情况,来判读 自己的状态
     */
    public int minCame(TreeNode root){
        if(root==null){
            // 空节点默认为 有覆盖状态,避免在叶子节点上放摄像头 
            return 2;
        }
        int left=minCame(root.left);
        int  right=minCame(root.right);
        
        // 如果左右节点都覆盖了的话, 那么本节点的状态就应该是无覆盖,没有摄像头
        if(left==2&&right==2){
            //(2,2) 
            return 0;
        }else if(left==0||right==0){
            // 左右节点都是无覆盖状态,那 根节点此时应该放一个摄像头
            // (0,0) (0,1) (0,2) (1,0) (2,0) 
            // 状态值为 1 摄像头数 ++;
            res++;
            return 1;
        }else{
            // 左右节点的 状态为 (1,1) (1,2) (2,1) 也就是左右节点至少存在 1个摄像头,
            // 那么本节点就是处于被覆盖状态 
            return 2;
        }
    }
}

有关LeetCode刷题第七周的更多相关文章

  1. Python 刷Leetcode题库,顺带学英语单词(31) - 2

    ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem

  2. IDEA使用LeetCode插件 - 2

    前言我们习惯用idea编写、调试代码,在LeetCode上刷题时,如果能够在IDEA编写代码,并且做好代码管理,是一件事半功倍的事情。对于后续复习题目,做笔记也会非常便利。本文目的在于介绍LeetCodeEditor的使用,以及配置工具类,最终目录结构如下:note:放置笔记src:放置代码leetcode.editor.cn:插件LeetCodeEditor自动生成utils:自定义的工具包,可用于自动化输入测试用例,定义题目需要的类(结构体)out:运行测试时自动生成LeetCodeEditorGitHub:https://github.com/shuzijun/leetcode-edit

  3. LeetCode——2347. 最好的扑克手牌 - 2

    一、题目给你一个整数数组ranks和一个字符数组suit。你有5张扑克牌,第i张牌大小为ranks[i],花色为suits[i]。下述是从好到坏你可能持有的手牌类型:“Flush”:同花,五张相同花色的扑克牌。“ThreeofaKind”:三条,有3张大小相同的扑克牌。“Pair”:对子,两张大小一样的扑克牌。“HighCard”:高牌,五张大小互不相同的扑克牌。请你返回一个字符串,表示给定的5张牌中,你能组成的最好手牌类型。注意:返回的字符串大小写需与题目描述相同。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/best-poker-hand/d

  4. 面试总结+力扣第二天刷题 - 2

    一.面试总结    4月20号下午进行了一场大数据视频面试,总结一下踩坑点:    1.确定面试后,第一件事要和HR确定面试方式,具体时间、地点、什么软件、岗位JD等必须信息。        这里很多人有一个思想误区,认为问的太多会给HR不好的印象;其实大可不必,如果你通过了简历筛选,你就有权力使用公司招聘的人力资源。    2.要在面试10分钟前就进入面试的环境中,以防突发事件。    3.面试最开始都会有一个自我介绍环节,这个自我介绍环节,一定要慎之又慎,最好写下来,让朋友、长辈等审核多遍。    注:我面试时,在这踩了一个坑,自我介绍的时候踩了我要面试的岗位一脚,被技术面试官抓住了这一点

  5. LeetCode:344. 反转字符串 - 2

    🍎道阻且长,行则将至。🍓🌻算法,不如说它是一种思考方式🍀算法专栏:👉🏻123一、🌱344.反转字符串题目描述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。来源:力扣(LeetCode)难度:简单提示:1s[i]都是ASCII码表中的可打印字符示例1:输入:s=[“h”,“e”,“l”,“l”,“o”]输出:[“o”,“l”,“l”,“e”,“h”]示例2:输入:s=[“H”,“a”,“n”,“n”,“a”,“h”]输出:[“h”,“a”,“n”,“n”,“a”,“H”

  6. 【日常系列】LeetCode《28·动态规划3》 - 2

    数据规模->时间复杂度10^8内容二维数组中的路径问题买卖股票的最佳时机lc62【剑指098】【top100】:不同路径https://leetcode.cn/problems/unique-paths/提示:1题目数据保证答案小于等于2*10^9#方案一:dfs+记忆化classSolution:defuniquePaths(self,m:int,n:int)->int:memo=[[-1]*nfor_inrange(m)]defdfs(i,j):ifi==m-1andj==n-1:return1ifi>=morj>=n:return0ifmemo[i][j]!=-1:returnmemo[

  7. sqli-labs基础篇【第七关】详细解析 - 2

    Ⅰ验证是否注入点  从下面的注入测试来看,只有两种输出结果  如果sql执行了,就会输出“Youarein…Useoutfile…”,反之输入“YouhaveanerrorinyourSQLsyntax”?id=1--+--Youarein....Useoutfile......?id=1'--+--YouhaveanerrorinyourSQLsyntax?id=-1'--+--YouhaveanerrorinyourSQLsyntax?id=1\--+--Youarein....Useoutfile......查看是否存在双引号注入正常输出,说明有执行,存在双引号注入?id=1"--+--

  8. 动力节点Vue笔记第七章 - 2

    7Vue37.1了解Vue3vue3官网地址https://cn.vuejs.org/vue3发布时间2020年9月18日。翻译:今天,我们很自豪地宣布Vue.js3.0“海贼王”正式发布。这个新的主要版本的框架提供了改进的性能、更小的捆绑包大小、更好的TypeScript集成、用于处理大规模用例的新API,以及为框架未来的长期迭代奠定了坚实的基础。3.0版本代表了两年多的开发工作,包括30多个RFC、2600多个提交、来自99个贡献者的628个拉取请求,以及核心回购之外的大量开发和文档工作。我们要向我们的团队成员表示最深切的感谢,感谢他们接受了这一挑战,感谢我们提出的撤回请求,感谢我们的赞助

  9. LeetCode:454. 四数相加 II —— 哈希表为什么叫哈希表~ - 2

    🍎道阻且长,行则将至。🍓🌻算法,不如说它是一种思考方式🍀算法专栏:👉🏻123hash是什么,哈希表为什么叫哈希表?一、🌱454.四数相加II题目描述:给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0nums1[i]+nums2[j]+nums3[k]+nums4[l]==0来源:力扣(LeetCode)难度:中等提示:n==nums1.lengthn==nums2.lengthn==nums3.lengthn==nums4.length1-2^28示例1:输入:nums1=[1,2],nums2=[-2,-1],n

  10. 【树】你真的会二叉树了嘛? --二叉树LeetCode专题Ⅳ - 2

     Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。🌈个人主页:主页链接🌈算法专栏:专栏链接     我会一直往里填充内容哒!🌈LeetCode专栏:专栏链接     目前在刷初级算法的LeetBook。若每日一题当中有力所能及的题目,也会当天做完发出🌈代码仓库:Gitee链接🌈点击关注=收获更多优质内容🌈目录题目:111. 二叉树的最小深度题解:代码实现:题目:700. 二叉搜索树中的搜索题解:代码实现:题目:701. 二叉搜索树中的插入操作题解:代码实现:题目:450. 删除二叉搜索树中的节点题解:代码实现:完结撒花:人生苦短,

随机推荐