目录
例3:由权值分别为1、12、13、4、8的叶子节点生成一颗哈夫曼树,它的带权路径长度为
1.剑指Offer
面试题14:剪绳子
牛客网暂无对应练习题
面试题24:反转链表
题目描述:
输入一个链表,反转链表后,输出新链表的表头。
思路:1.需要使用三个指针用于保存当前节点、当前节点的前一个节点、当前节点的后一个节点(防止链表断裂)
2.可借助图形帮助分析,反转链表的头节点为原来链表的尾节点
3.需要考虑输入链表头指针为nullptr、只有一个节点、有多个节点等情况,注意代码的鲁棒性,方法是提前想好测试用例,利用测试用例对代码进行检查。
代码:
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
ListNode* ReverseHead=nullptr;
ListNode* pNode=pHead;
ListNode* pPre=nullptr;
while(pNode!=nullptr){
ListNode* pNext=pNode->next;
if(pNext==nullptr){
ReverseHead=pNode;
}
pNode->next=pPre;
pPre=pNode;
pNode=pNext;
}
return ReverseHead;
}
};
2.Leetcode
例1:给n个孩子分糖果,满足下列条件时求最少分发的糖果数。
题目描述:
There are N children standing in a line. Each child is assigned a rating value.
You are giving candies to these children subjected to the following requirements:
- Each child must have at least one candy.
- Children with a higher rating get more candies than their neighbors.
What is the minimum candies you must give?
思路:动态规划,因为是求最优问题且该问题能被分解成若干重复的子问题。
代码:
class Solution {
public:
int candy(vector<int> &ratings) {
int len=ratings.size();
if(len==1) return 1; //只有一个孩子
vector<int> v(len,1); //每个孩子先分一个糖果
int sum=0;
for(int i=1;i<len;i++){ //从左向右扫描,保证一个方向上ratings值越大分得的糖果越多
if(ratings[i]>ratings[i-1]){
v[i]=v[i-1]+1;
}
}
for(int i=len-2;i>=0;i--){ //从右向左扫描,保证该方向上ratings值越大分得的糖果越多
i