贪心算法-LeetCode 134111(递归算法,异或性质,贪心)

Posted 算法工程师之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心算法-LeetCode 134111(递归算法,异或性质,贪心)相关的知识,希望对你有一定的参考价值。


重磅干货,第一时间送达

作者:TeddyZhang,公众号:算法工程师之路

栈问题:LeetCode #134 #111

1
编程题

【交换两个数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

2
资源分享


欢迎关注我的个人公众号 (算法工程师之路),公众号内有大量视频资料和电子书资料以及算法笔记,回复关键字即可获取!

号外,算法刷题二群已经建立,但由于邀请人数超出限制,无法扫码添加,可以加号主微信(Leopard7319538)说明来意,可以加入到算法刷题群,每天2道编程题3道概念题,我们一起坚持下去!!!

贪心算法-LeetCode 134、111(递归算法,异或性质,贪心)


更多精彩推荐,请关注我们
在看点这里



以上是关于贪心算法-LeetCode 134111(递归算法,异或性质,贪心)的主要内容,如果未能解决你的问题,请参考以下文章

不要再死刷LeetCode啦,先掌握这常用的八大算法思想再说!枚举递推递归分治动态规划贪心回溯模拟

5.算法通关面试 --- 递归and分治and贪心

5.算法通关面试 --- 递归and分治and贪心

搞定大厂算法面试之leetcode精讲4.贪心

leetcode刷题-贪心算法(持续更新)

贪心算法,递归算法,动态规划算法比较与总结