力扣刷题篇——贪心

简介: 力扣刷题篇——贪心

1221题目描述🌌:


在一个 平衡字符串 中,'L' 和 'R' 字符的数量是相同的。


给你一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串。


注意:分割得到的每个字符串都必须是平衡字符串,且分割得到的平衡字符串是原平衡字符串的连续子串。


返回可以通过分割得到的平衡字符串的 最大数量 。


示例 1:

输入:s = "RLRRLLRLRL"

输出:4

解释:s 可以分割为 "RL"、"RRLL"、"RL"、"RL" ,每个子字符串中都包含相同数量的 'L' 和 'R' 。


示例 2:

输入:s = "RLLLLRRRLR"

输出:3

解释:s 可以分割为 "RL"、"LLLRRR"、"LR" ,每个子字符串中都包含相同数量的 'L' 和 'R' 。


示例 3:

输入:s = "LLLLRRRR"

输出:1

解释:s 只能保持原样 "LLLLRRRR".


示例 4:

输入:s = "RLRRRLLRLL"

输出:2

解释:s 可以分割为 "RL"、"RRRLLRLL" ,每个子字符串中都包含相同数量的 'L' 和 'R' 。


解题思路🌌:

将字符串一次性分割成尽可能多的平衡段,则最多段数等于从前往后遍历时达到平衡的次数,一次遍历即可。


遇到'L'就加+1 反正就-1

每次达到平衡 就是次数为0时就记录count 表示找到了一个平衡字符串

输出即可

代码附上🌌:  

        int count=0;
        int res=0;
        for(int i=0;i<s.length();i++){
            char ch=s.charAt(i);
           res+=(ch=='L')?+1:-1; 
           if(res==0){
               count++;
           }
        }
        return count;
    }
}

1217 题目描述🌌:


有 n 个筹码。第 i 个芯片的位置是 position[i] 。


我们需要把所有筹码移到同一个位置。在一步中,我们可以将第 i 个芯片的位置从 position[i] 改变为:


position[i] + 2 或 position[i] - 2 ,此时 cost = 0

position[i] + 1 或 position[i] - 1 ,此时 cost = 1

返回将所有筹码移动到同一位置上所需要的 最小代价 。


示例 1:

输入:position = [1,2,3]

输出:1

解释:第一步:将位置3的芯片移动到位置1,成本为0。

第二步:将位置2的芯片移动到位置1,成本= 1。

总成本是1。


示例 2:

输入:position = [2,2,2,3,3]

输出:2

解释:我们可以把位置3的两个芯片移到位置2。每一步的成本为1。总成本= 2。


示例 3:

输入:position = [1,1000000000]

输出:1


解题思路:🌌 :

根据题意可知,移动偶数步不消耗步数,移动奇数倍消耗步数1步

为了最小化步数 先将偶数步数设置为0

分别把偶数位跟奇数位各自挪到一起

只需要计算一个数组中 奇数跟偶数的数量即可

返回最小的那一个

代码附上🌌:

class Solution {
    public int minCostToMoveChips(int[] position) {
    int oddnumber=0; //奇数的个数
    int evennumber=0;//偶数的个数
    for(int i=0;i<position.length;i++){
        if(position[i]%2==0){
            evennumber++; //偶数++
        }
        else {
            oddnumber++;//奇数++
        }
    }
  return Math.min(evennumber,oddnumber);
    }
}

1029题目描述🌌:


公司计划面试 2n 人。给你一个数组 costs ,其中 costs[i] = [aCosti, bCosti] 。第 i 人飞往 a 市的费用为 aCosti ,飞往 b 市的费用为 bCosti 。


返回将每个人都飞到 a 、b 中某座城市的最低费用,要求每个城市都有 n 人抵达。


示例 1:

输入:costs = [[10,20],[30,200],[400,50],[30,20]]

输出:110

解释:

第一个人去 a 市,费用为 10。

第二个人去 a 市,费用为 30。

第三个人去 b 市,费用为 50。

第四个人去 b 市,费用为 20。


最低总费用为 10 + 30 + 50 + 20 = 110,每个城市都有一半的人在面试。


示例 2:

输入:costs = [[259,770],[448,54],[926,667],[184,139],[840,118],[577,469]]

输出:1859


示例 3:

输入:costs = [[515,563],[451,713],[537,709],[343,819],[855,779],[457,60],[650,359],[631,42]]

输出:3086


解题思路🌌:

按照价格A 和价格B分别进行排序

将前n个人飞往a 然后用总的人数减去前n个人即为b的人数

代码附上🌌:

class Solution {
    public int twoCitySchedCost(int[][] costs) {
      Arrays.sort(costs, new Comparator<int[]>() {
          @Override
          public int compare(int[] o1, int[] o2) {
              return o1[0] - o1[1] - (o2[0] - o2[1]);
          }
      });
      int res = 0;
      int n = costs.length / 2;
      for (int i = 0; i < n; ++i) res += costs[i][0] + costs[i + n][1];
      return res;
    }
}

10.11 题目描述:🌌


在一个整数数组中,“峰”是大于或等于相邻整数的元素,相应地,“谷”是小于或等于相邻整数的元素。例如,在数组{5, 8, 4, 2, 3, 4, 6}中,{8, 6}是峰, {5, 2}是谷。现在给定一个整数数组,将该数组按峰与谷的交替顺序排序。


示例:

输入: [5, 3, 1, 2, 3]

输出: [5, 1, 3, 2, 3]


解题思路🌌:

先排序,再依次遍历数组,每两个数交换位置。


也可以不排序,直接判断奇数位和偶数位的数字是否符合要求。


如果当前i位置为峰判断当前位置跟是否小于前一个位置若小于则交换 大于则不动

如果当前位置为谷则判断当前位置是否小于前一个位置若大于则交换小于则不动

代码附上🌌:

class Solution {
    public void wiggleSort(int[] nums) {
        for(int i=1;i<nums.length;i++){
            if(i%2==0){
                if(nums[i]>nums[i-1])
                {
                    swap(nums,i,i-1);
                }
            }else{
                if(nums[i]<nums[i-1]){
                    swap(nums,i,i-1);
                }
            }
        }
    }
private  void  swap(int arr[],int i,int j){
     int temp=arr[i];
       temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
    }
}

以上就是小王同学带给大家的几道经典的贪心算法





相关文章
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
59 6
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
52 4
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
121 2
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
35 1
|
3月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
4月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
66 7
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
54 5
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
29 4
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
Leetcode题目"剑指 Offer 21. 调整数组顺序使奇数位于偶数前面"的两种Python解决方案,一种是使用双端队列调整数组顺序,另一种是使用双指针法将奇数移到数组前半部分,偶数移到后半部分。
29 4