LeetCode 135. Candy

本文介绍了一种糖果分配算法,确保评分较高的孩子获得更多的糖果,同时介绍了一个寻找整数数组中最大索引差的算法,该索引差满足后一个元素大于前一个元素的条件。

This question is one of my favourites.

Suppose, the rating vectors are [4, 2, 3, 4, 1]

since, each child will at least get 1 candy. we can first initialize the vector all for 1.

if, the neighbour rating is larger than former, the child will at least have one more than the left one.  --> from left to right

if, the neighbour rating is larger than the former, the child will at least have one more than the the right one ---> from right  to left.


first start with [1, 1, 1, 1, 1]

after the first round (from left  to right) ---> [1, 1, 2, 3, 1]

after the second round(from right to left) --> [2, 1, 2, 3, 1] ---> sum = 9

#include <vector>
#include <iostream>
using namespace std;

int candy(vector<int>& ratings) {
  if(ratings.size() == 0) return 0;
  int n = ratings.size();
  vector<int> dp(n, 1);
  for(int i = 1; i < n; ++i) {
    if(ratings[i] > ratings[i - 1]) {
      dp[i] = dp[i-1] + 1;
    }
  }

  for(int i = n - 2; i >= 0; --i) {
    if((ratings[i] > ratings[i + 1]) && (dp[i] <= dp[i+1])) {
      dp[i] = dp[i+1] + 1;
    }
  }
  int sum = 0;
  for(int i = 0; i < n; ++i) {
    sum += dp[i];
  }
  return sum;
}

int main(void) {
  vector<int> nums{4, 2, 3, 4, 1};
  cout << candy(nums) << endl;
}


Google Interview Question which is very similar to this one.

Input an array of integers, find the maximum (j-i) which A[j] > A[i], output the (i, j)

For example: [5, 2, 4, 5, 3, 8], the output is (0, 5) ; [3, 2, 1, 2, 3, 4], the output is (0, 5)

#include <iostream>
#include <vector>
using namespace std;

vector<int> maxDiffIndex(vector<int>& nums) {
  int n = nums.size();
  if(n < 2) return {};
  vector<int> dp(n, 0);
  vector<int> backward(n, 0);
  for(int i = 1; i < nums.size(); ++i) {
    dp[i] = (nums[i] > nums[dp[i-1]] ? dp[i-1] : i);
  }
  backward[n-1] = n - 1;
  for(int i = n - 2; i >= 0; ++i) {
     dp[i] = (nums[i] < nums[dp[i+1]] ? dp[i-1] : i);
  }
 int maxDiff = 0, start = 0, end = 0;
  for(int i = 1; i < nums.size(); ++i) {
    if(maxDiff < (dp[i] - backward[i])) {
      maxDiff = abs(backward[i] - dp[i]);
      start = dp[i];
      end = backward[i];
    }
  }
  if(maxDiff == 0) return {};
  return {start, end};
}



标题基于Python的汽车之家网站舆情分析系统研究AI更换标题第1章引言阐述汽车之家网站舆情分析的研究背景、意义、国内外研究现状、论文方法及创新点。1.1研究背景与意义说明汽车之家网站舆情分析对汽车行业及消费者的重要性。1.2国内外研究现状概述国内外在汽车舆情分析领域的研究进展与成果。1.3论文方法及创新点介绍本文采用的研究方法及相较于前人的创新之处。第2章相关理论总结和评述舆情分析、Python编程及网络爬虫相关理论。2.1舆情分析理论阐述舆情分析的基本概念、流程及关键技术。2.2Python编程基础介绍Python语言特点及其在数据分析中的应用。2.3网络爬虫技术说明网络爬虫的原理及在舆情数据收集中的应用。第3章系统设计详细描述基于Python的汽车之家网站舆情分析系统的设计方案。3.1系统架构设计给出系统的整体架构,包括数据收集、处理、分析及展示模块。3.2数据收集模块设计介绍如何利用网络爬虫技术收集汽车之家网站的舆情数据。3.3数据处理与分析模块设计阐述数据处理流程及舆情分析算法的选择与实现。第4章系统实现与测试介绍系统的实现过程及测试方法,确保系统稳定可靠。4.1系统实现环境列出系统实现所需的软件、硬件环境及开发工具。4.2系统实现过程详细描述系统各模块的实现步骤及代码实现细节。4.3系统测试方法介绍系统测试的方法、测试用例及测试结果分析。第5章研究结果与分析呈现系统运行结果,分析舆情数据,提出见解。5.1舆情数据可视化展示通过图表等形式展示舆情数据的分布、趋势等特征。5.2舆情分析结果解读对舆情分析结果进行解读,提出对汽车行业的见解。5.3对比方法分析将本系统与其他舆情分析系统进行对比,分析优劣。第6章结论与展望总结研究成果,提出未来研究方向。6.1研究结论概括本文的主要研究成果及对汽车之家网站舆情分析的贡献。6.2展望指出系统存在的不足及未来改进方向,展望舆情
### 贪心算法在 LeetCode 上的应用 贪心算法是一种通过局部最优选择来达到全局最优解的方法。其核心思想是在每一步都做出当前状态下最好的选择,从而希望最终能够得到整体的最优解[^1]。 以下是基于 Python 的几个经典贪心算法题目及其解决方案: --- #### 题目 1: **LeetCode 455. Assign Cookies** 给定两个数组 `g` 和 `s`,分别表示孩子的胃口值和饼干大小。每个孩子最多只能吃一块饼干,求最大满足的孩子数量。 ##### 解法 先对两个数组进行排序,然后从小到大分配饼干给尽可能多的孩子。 ```python def findContentChildren(g, s): g.sort() s.sort() i, j = 0, 0 count = 0 while i < len(g) and j < len(s): if s[j] >= g[i]: count += 1 i += 1 j += 1 return count ``` 此方法利用了贪心策略,在每次循环中优先考虑最小需求的孩子并匹配最合适的饼干[^3]。 --- #### 题目 2: **LeetCode 135. Candy** 有 n 个小孩站在一条直线上,每个小孩有一个评分值。分发糖果的要求是:如果某个小孩的评分高于相邻的小孩,则该小孩获得更多的糖果;至少每人一颗糖果。 ##### 解法 两次遍历数组,一次从前向后,另一次从后向前,确保左右两侧的关系都被满足。 ```python def candy(ratings): n = len(ratings) candies = [1] * n for i in range(1, n): if ratings[i] > ratings[i - 1]: candies[i] = candies[i - 1] + 1 for i in range(n - 2, -1, -1): if ratings[i] > ratings[i + 1]: candies[i] = max(candies[i], candies[i + 1] + 1) return sum(candies) ``` 这种方法通过两轮扫描实现了局部最优条件下的全局最优解。 --- #### 题目 3: **LeetCode 621. Task Scheduler** 给定一组任务字符以及冷却时间 `n`,计算完成所有任务所需的最少单位时间数。 ##### 解法 统计频率最高的任务数目,并根据这些任务之间的间隔安排其他任务。 ```python from collections import Counter def leastInterval(tasks, n): task_counts = list(Counter(tasks).values()) max_freq = max(task_counts) max_count = task_counts.count(max_freq) intervals = (max_freq - 1) * (n + 1) + max_count return max(len(tasks), intervals) ``` 上述代码的关键在于理解如何合理填充高频任务之间的时间间隙。 --- #### 总结 解决贪心类问题时,通常需要明确以下几个方面: - 是否可以通过逐步优化子结构解决问题? - 如何定义“局部最优”,它是否能导向“全局最优”? 此外,清晰表达逻辑流程有助于构建完整的解决方案[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值