首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >牛顿法-LeetCode 319、322、324、331、332、389

牛顿法-LeetCode 319、322、324、331、332、389

作者头像
算法工程师之路
发布于 2019-12-24 09:33:20
发布于 2019-12-24 09:33:20
55600
代码可运行
举报
运行总次数:0
代码可运行

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

牛顿法:

LeetCode # 319 322 324 331 332 389

1

编程题

【LeetCode #319】灯泡开关

初始时有 n 个灯泡关闭。第 1 轮,你打开所有的灯泡。第 2 轮,每两个灯泡你关闭一次。第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭)。第 i 轮,每 i 个灯泡切换一次开关。对于第 n 轮,你只切换最后一个灯泡的开关。找出 n 轮后有多少个亮着的灯泡。

示例: 输入: 3 输出: 1

解题思路:求平方数,使用牛顿法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int bulbSwitch(int n) {
        if (n < ) return ;
        long r = n;
        while(r * r > n) {
            r = (r + n/r) / ;
        }
        return (int) r;
    }
};

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/bulb-switcher

【LeetCode #322】零钱兑换

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。

示例 1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1

解题思路:

核心递推式:dp[j] = min(dp[j], dp[j-coins[i]]+1); 表示总金额j所需的硬币数,以及减掉一个coins,即dp[j-coins[i]]所需的硬币数再加1。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        int INF = amount + ;
        vector<int> dp(amount+, INF+);
        dp[] = ;
        for(int i = ; i < coins.size(); i++) {
            for(int j = coins[i]; j < amount+; j++){
                dp[j] = min(dp[j], dp[j - coins[i]] + );
            }
        }
        return dp[amount] < INF ? dp[amount] : -1;
    }
};

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/coin-change

【LeetCode #324】摆动排序 II

给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]… 的顺序。

示例 1: 输入: nums = [1, 5, 1, 1, 6, 4] 输出: 一个可能的答案是 [1, 4, 1, 5, 1, 6]

解题思路:

首先对nums进行排序,然后从中间开始分开,进行穿插,注意中间点位置的计算,要考虑size为奇数或者偶数,得到统一的公式,mid = (size+1) / 2 - 1.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    void wiggleSort(vector<int>& nums) {
        int size = nums.size();
        vector<int> tmp(nums);
        int end = size-1, mid = (size+) /  - ;
        sort(tmp.begin(), tmp.end());
        for(int i = ; i < size; i++) {
            nums[i] = (i %  == ) ? tmp[mid--] : tmp[end--];
        }
    }
};

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/wiggle-sort-ii

【LeetCode #331】验证二叉树的前序序列化

序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #。 示例 1: 输入: "9,3,4,#,#,1,#,#,2,#,6,#,#" 输出: true

解题思路:

这道题目可以通过二叉树的性质来解,对于一棵二叉树,其叶子节点的数量是非叶子节点数量 + 1。因此我们初始化degree = 1,每次遇到叶子结点就减1,遇到其他非叶子节点就加1,判断degree最后是否为零即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    bool isValidSerialization(string preorder) {
        int degree = ;
        int n = preorder.length();
        for(int i = ; i < n; i++) {
            if (degree == ) return false;
            if (preorder[i] == ',') continue;
            if (preorder[i] == '#') degree -= ;
            else {
                while(i < n && preorder[i] != ',') i++;
                degree += ;
            }
        }
        return degree == ;
    }
};

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/verify-preorder-serialization-of-a-binary-tree/

【LeetCode #332】重新安排行程

给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 出发。

示例 1: 输入: [["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]] 输出: ["JFK", "MUC", "LHR", "SFO", "SJC"]

解题思路:

使用回溯法,需要注意数据结构使用map,这是由于题中的说明,但行程 ["JFK", "LGA"] 与 ["JFK", "LGB"] 相比就更小,排序更靠前,需要有序性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int n = ;
    map<string, map<string, int>> mp;
    vector<string> res, tmp;
    vector<string> findItinerary(vector<vector<string>>& tickets) {
        n = tickets.size();
        for(auto& ticket: tickets) {
            ++mp[ticket[]][ticket[]];
        }
        tmp.emplace_back("JFK");
        dfs();
        return res;
    }
    void dfs() {
        if (res.size() == n + ) return;
        if (tmp.size() == n + ) {
            res = tmp;  return;
        }
        for(auto& tt: mp[tmp.back()]) {
            if (tt.second == ) continue;
            --tt.second;
            tmp.emplace_back(tt.first);
            dfs();
            tmp.pop_back();
            ++tt.second;
        }
    }
};

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reconstruct-itinerary

【LeetCode #389】找不同

给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。

示例: 输入: s = "abcd" t = "abcde" 输出: e

解题思路:由于t是s的重排再添加一个字母,然后我们直接求和,然后相减即可!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    char findTheDifference(string s, string t) {
        long sum = ;
        for (auto i: t) sum += i;
        for (auto i: s) sum -=i;
        return static_cast<char>(sum);
    }
};

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-the-difference

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​LeetCode刷题实战518:零钱兑换 II
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2022/03/03
2220
LeetCode 332. 重新安排行程(欧拉路径)
给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。 所有这些机票都属于一个从JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 出发。
Michael阿明
2020/07/13
6640
LeetCode 332. 重新安排行程(欧拉路径)
数字问题-LeetCode 507、508、513、515、516、520、518(DP、BFS)
LeetCode # 507 508 509 513 515 516 520 518
算法工程师之路
2020/02/13
4510
DP、DFS-LeetCode 198、332、165(DP, DFS)
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
算法工程师之路
2019/11/14
5660
LeetCode 518. 零钱兑换 II(动态规划)
给定不同面额的硬币和一个总金额。 写出函数来计算可以凑成总金额的硬币组合数。 假设每一种面额的硬币有无限个。
Michael阿明
2020/07/13
9540
【LeetCode两题选手】算法类题目(8.7)
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
看、未来
2020/08/25
2990
数字问题-LeetCode 435、436、441、442、443、445、448(数字)
示例 1: 输入: [ [1,2], [2,3], [3,4], [1,3] ] 输出: 1 解释: 移除 [1,3] 后,剩下的区间没有重叠。
算法工程师之路
2020/02/13
6110
​LeetCode刷题实战322:零钱兑换
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/07/29
3090
LeetCode 322. 零钱兑换(DP)
给定不同面额的硬币 coins 和一个总金额 amount。 编写一个函数来计算可以凑成总金额所需的最少的硬币个数。 如果没有任何一种硬币组合能组成总金额,返回 -1。
Michael阿明
2021/02/20
2980
LeetCode 322. 零钱兑换(DP)
LeetCode-322-零钱兑换
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
benym
2022/07/14
5570
LeetCode-322-零钱兑换
组合问题汇总-LeetCode 46、77、39、40、219、377、1014(回溯法,DP,贪心)
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/permutations
算法工程师之路
2019/12/13
4880
LeetCode 312. 戳气球(DP,难)
有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。
Michael阿明
2021/02/20
5670
LeetCode 312. 戳气球(DP,难)
【leetcode刷题】T166-零钱兑换编程题
https://leetcode.com/problems/coin-change/
木又AI帮
2019/09/19
8180
二分问题-LeetCode 69、167、92(二分,牛顿法,双指针)
实现 int sqrt(int x) 函数。 计算并返回 x 的平方根,其中 x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
算法工程师之路
2019/11/14
5080
打卡群刷题总结0926——零钱兑换
链接:https://leetcode-cn.com/problems/coin-change
木又AI帮
2020/10/10
3160
LeetCode 1230. 抛掷硬币(DP)
有一些不规则的硬币。在这些硬币中,prob[i] 表示第 i 枚硬币正面朝上的概率。
Michael阿明
2021/02/19
9020
图算法-LeetCode 210、332(拓扑排序,深度搜索,BFS,DFS)
现在你总共有 n 门课需要选,记为 0 到 n-1。 在选修某些课程之前需要一些先修课程。例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。 可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。
算法工程师之路
2019/10/23
6460
动态规划:给你一些零钱,你要怎么凑?
链接:https://leetcode-cn.com/problems/coin-change-2/
代码随想录
2021/02/26
1.5K0
动态规划:给你一些零钱,你要怎么凑?
数字问题-LeetCode 524、525、526、528、530、537、539、540
LeetCode # 524 525 526 528 530 537 539 540
算法工程师之路
2020/02/13
5230
【动态规划算法练习】day16
DP42 【模板】完全背包 本题目来源于牛客网,大家可以点开上面的链接,进入题目页面进行练习。
摘星
2023/10/15
1970
【动态规划算法练习】day16
推荐阅读
相关推荐
​LeetCode刷题实战518:零钱兑换 II
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档