贪心算法-LeetCode 134111(递归算法,异或性质,贪心)
Posted 算法工程师之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心算法-LeetCode 134111(递归算法,异或性质,贪心)相关的知识,希望对你有一定的参考价值。
重磅干货,第一时间送达
作者:TeddyZhang,公众号:算法工程师之路
栈问题:LeetCode #134 #111
【交换两个数Swap函数】
解题思路:
对于swap函数使用中间变量的形式大家都不陌生了,但是对于面试官来说这种方法不出奇,并不是面试官想要的!有没有不使用中间变量的呢?
在swap2函数中,我们可以使用这样的方式来交换a和b的值,但是swap2函数有一个缺陷就是,a+b有可能会造成数据溢出!!!
在swap3函数中,使用异或来进行a和b的交换,关于异或的性质如下:
假设有A, B, C三个数,C 相等于 A ^ B, 则必定 A ^ C 相等于 B, B ^ C 相等于 A
void swap1(int& a, int& b) {
int tmp = a;
a = b;
b = tmp;
}
void swap2(int& a, int& b) {
a = a + b;
b = a - b;
a = a - b;
}
void swap3(int& a, int& b) {
a ^= b;
b ^= a;
a ^= b;
}
【LeetCode #134】加油站
在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。
说明:
如果题目有解,该答案即为唯一答案。
输入数组均为非空数组,且长度相同。
输入数组中的元素均为非负数。
示例 1:
输入:
gas = [1,2,3,4,5]
cost = [3,4,5,1,2]
输出: 3
解释:
从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油
开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油
开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油
开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油
开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油
开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。
因此,3 可为起始索引。
解题思路:
首先我们要分析这个起点会不会存在?这个其实很简单,如果将所有的gas总油量 >= 车子的cost总耗油量,从而车子可以走一周的。
我们分析一下,假设起始点为x, 如果总的gas-总的cost大于零时,则我们将当前路径从其实路径x一分为二,左侧的部分剩余油量必定 <= 0,而右侧的部分剩余油量必定 >= 0. 这样才可以使得车子可以完成一周的路程!
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int total = 0, cur = 0, start = 0;
for(int i = 0; i < gas.size(); i++){
total += (gas[i] - cost[i]);
cur += (gas[i] - cost[i]);
if(cur < 0){
start = i + 1;
cur = 0;
}
}
return (total >= 0) ? start : -1;
}
};
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/gas-station
【LeetCode #111】二叉树的最小深度
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最小深度 2.
解题思路:
直接使用递归,会有四种情况:
root等于null,返回0
如果root.left或者root.right两者之一为null, 另外一个不为null,从而返回1 + mindepth(…)
如果两者都不为null,则返回1 + 左右子树的最小深度的最小值 !
C++代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int minDepth(TreeNode* root) {
if(root == nullptr){
return 0;
}
if (root->left == nullptr && root->right != nullptr){
return 1 + minDepth(root->right);
}
if (root->left != nullptr && root->right == nullptr){
return 1 + minDepth(root->left);
}
return 1 + min(minDepth(root->left), minDepth(root->right));
}
};
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-depth-of-binary-tree
欢迎关注我的个人公众号 (算法工程师之路),公众号内有大量视频资料和电子书资料以及算法笔记,回复关键字即可获取!
号外,算法刷题二群已经建立,但由于邀请人数超出限制,无法扫码添加,可以加号主微信(Leopard7319538)说明来意,可以加入到算法刷题群,每天2道编程题3道概念题,我们一起坚持下去!!!
完
以上是关于贪心算法-LeetCode 134111(递归算法,异或性质,贪心)的主要内容,如果未能解决你的问题,请参考以下文章