前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >贪心算法-LeetCode 134、111(递归算法,异或性质,贪心)

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

作者头像
算法工程师之路
发布2019-10-24 10:53:03
6690
发布2019-10-24 10:53:03
举报

作者: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 = , cur = , start = ;
        for(int i = ; i < gas.size(); i++){
            total += (gas[i] - cost[i]);
            cur += (gas[i] - cost[i]);
            if(cur < ){
                start = i + ;
                cur = ;
            }
        }
        return (total >= ) ? 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 ;
        }
        if (root->left == nullptr && root->right != nullptr){
            return  + minDepth(root->right);
        }
        if (root->left != nullptr && root->right == nullptr){
            return  + minDepth(root->left);
        }
        return  + min(minDepth(root->left), minDepth(root->right));
    }
};

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/minimum-depth-of-binary-tree

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法工程师之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档