小奥的学习笔记

  • Home
  • Learning & Working
    • Speech Enhancement Notes
    • Programming language
    • Computer & DL
    • MOOC
  • Life
    • Life Time
    • Thinking & Comprehension
    • Volunteer
    • Plan
    • Travel
  • Footprints
  • GuestBook
  • About
    • About Me
    • 个人履历
    • 隐私策略
  1. 首页
  2. Study-notes
  3. Programming language
  4. Algorithm
  5. Leetcode
  6. 正文

Leetcode题目解析(191206):33&34&39&42

2019年12月6日 1398点热度 0人点赞 0条评论

Leetcode 39:组合总和

题目描述

给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的数字可以无限制重复被选取。

示例

输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]

输入: candidates = [2,3,5], target = 8,
所求解集为:
[
  [2,2,2,2],
  [2,3,3],
  [3,5]
]

题目解析

题目解析

代码实现

class Solution {
public:
private:
    vector<int> candidates;
    vector<int> path;
    vector<vector<int>> res;
public:
    void DFS(int start, int target)
    {
        if(target==0)
        {
            res.push_back(path);
            return ;
        }
        for(int i=start;i<candidates.size()&&target-candidates[i]>=0;i++)
        {
           path.push_back(candidates[i]);
           DFS(i,target-candidates[i]);
           path.pop_back(); 
        }
    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        this->candidates=candidates;
        DFS(0,target);
        return res;
    }
};

复杂度

复杂度分析

Leetcode 42:接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例

输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6

示例

解题思路

这个题目的想法,最容易想到的就是将它以最高的地方为基准分为左右两列进行相加计算,因为相加不可能跨过最高的那个地方。
对于左侧,我们从0向最高值靠拢,首先判断当前位置的值是否小于left(left刚开始是第0个,判断从第0个开始判断没问题),如果小于,那么就将suml累加上left-A[i]即可,如果不是小于,那么代表着从这一点开始,又要重新计算一个容量,所以令left=A[i]。如下所示:

if (A[i] < left)
            suml += left - A[i];
        else
            left = A[i];

对于右侧同理,从最右侧n-1开始往左判断,过程与上面相同,不再重复。代码如下:

        if (A[i] < right)
            sumr += right - A[i];
        else
            right = A[i];

代码实现

int trap(vector<int>& height) {
    int n = height.size();
    int maxHeight = 0;
    int left = 0;//由左往最大值计算
    int right = 0;//反向
    int suml = 0, sumr = 0;
    //寻找最大高度
    for (int i = 0; i < n; i++)
        if (height[i] > height[maxHeight])
            maxHeight = i;
    //寻找到最大高度了。先计算最侧的最大容量
    for (int i = 0; i < maxHeight; i++)
    {
        if (height[i] < left)
            suml += left - height[i];
        else
            left = height[i];
    }
    //再计算右侧
    for (int i = n - 1; i > maxHeight; i--)
    {
        if (height[i] < right)
            sumr += right - height[i];
        else
            right = height[i];
    }
    return suml + sumr;
}

复杂度

时间复杂度:O(n)
空间复杂度:O(1)

复杂度分析

Leetcode 33:搜索旋转排序数组

题目描述

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。

你可以假设数组中不存在重复的元素。

你的算法时间复杂度必须是 O(log n) 级别。

解题思路

可以想到利用二分法去做,但是我做的用时还是太高。这里展示一个leetcode的一个4ms执行用时的代码,把条件用了异或符号来表示,这种表示方法还是很不错的。

代码实现

 int search(vector<int>& nums, int target)
{
    int left = 0;
    int right = nums.size() - 1;
    while (left <= right)
    {
        int mid = (left + right) / 2;
        if (nums[mid] == target)
        {
            return mid;
        }
        else if ((nums[0] > target) ^ (nums[0] > nums[mid]) ^ (target > nums[mid]))
        {
            left = mid + 1;
        }
        else
        {
            right = mid - 1;
        }
    }
    return -1;
}

复杂度

时间复杂度:O(logn)
空间复杂度:O(1)

复杂度分析

Leetcode 34:在排序数组中查找元素的第一个和最后一个位置

题目描述

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

你的算法时间复杂度必须是 O(log n) 级别。

如果数组中不存在目标值,返回 [-1, -1]。

解题思路

很明显,使用二分法,具体细节见代码即可。

代码实现

vector<int> searchRange(vector<int>& nums, int target) {
    vector<int>result(2, -1);
    if (nums.empty())
        return result;
    int l = 0, r = nums.size() - 1;
    if (nums[l] > target || nums[r] < target)
        return result;
    while (l < r) {
        int mid = l + (r - l) / 2;
        if (nums[mid] >= target)
            r = mid;
        else
            l = mid + 1;
    }
    if (nums[l] == target)
        result[0] = l;
    r = nums.size();
    while (l < r) {
        int mid = l + (r - l) / 2;
        if (nums[mid] > target)
            r = mid;
        else
            l = mid + 1;
    }
    if (nums[l - 1] == target)
        result[1] = l - 1;
    return result;
}

复杂度

复杂度分析

时间复杂度:O(nlogn),空间复杂度:O(1)

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: leetcode
最后更新:2019年12月6日

yszhang

这个人很懒,什么都没留下

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

搜索
欢迎关注我的个人公众号
最新 热点 随机
最新 热点 随机
DEEPFILTERNET:一种基于深度滤波的全频带音频低复杂度语音增强框架 奥地利匈牙利九日游旅程 论文阅读之Study of the General Kalman Filter for Echo Cancellation 小奥看房之鸿荣源珈誉府 杭州往返旅途及西溪喜来登和万怡的体验报告 2022年的第一篇碎碎念
奥地利匈牙利九日游旅程论文阅读之Study of the General Kalman Filter for Echo CancellationDEEPFILTERNET:一种基于深度滤波的全频带音频低复杂度语音增强框架
我对奥数班的怨念 Leetcode题目解析(191128):2&3&72&75&76 day7练习1:使用管道实现父子进程间通信,完成:ls | wc –l。 算法笔记之线性规划网络流问题(2) 小花豆生活第1天:4号口安保初体验 由梦比优斯奥特曼主题曲所想到的
标签聚合
Java linux 生活 高中 python学习 算法 鸟哥的linux私房菜 Python leetcode 学习
最近评论
davidcheung 发布于 8 个月前(02月09日) The problem has been fixed. May I ask if you can s...
tk88 发布于 8 个月前(02月07日) Hmm is anyone else having problems with the pictur...
cuicui 发布于 12 个月前(10月20日) :wink:
niming 发布于 1 年前(09月19日) 同级校友,能刷到太巧了
davidcheung 发布于 2 年前(08月16日) 我得找一下我之前整理的word文档看一下,如果找到了我就更新一下这篇文章。
Nolan 发布于 2 年前(07月25日) 您的笔记非常有帮助。贴图不显示了,可以更新一下吗?
davidcheung 发布于 3 年前(06月19日) 到没有看webrtc的代码。现在主要在看我们公司的代码了。。。只是偶尔看一看webrtc的东西。。。
aobai 发布于 4 年前(03月13日) gain_change_hangover_ 应该是每三个block 只能够调整一次,这样保证每帧...
匿名 发布于 5 年前(12月30日) 烫
小奥 发布于 5 年前(12月12日) webRTC里面的NS本身我记得就是在C++里面呀

COPYRIGHT © 2025 小奥的学习笔记. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

陕ICP备19003234号-1

鲁公网安备37120202000100号