有趣的算法题01

码影寻踪
• 阅读 184

有趣的算法题01

​ 为提升算法、编程能力,开始刷LeetCode,一些于我有益的题记录在此系列中(或许对大佬们而言尽是些简单的题,还请见谅)。

A good programmer is someone who looks both ways before crossing a one-way street. --Doug Linder, systems administrator

[多数元素] -- 摩尔投票法

【问题描述】

​ 给定一个数组,寻找其中出现次数大于一半的多数元素(假设数组不为空,总存在这样的多数元素),参LeetCode 169. 多数元素

【解法思路】

  1. 计数取值:遍历整个数组,取出计数最大的那个,简单粗暴。
  2. 排序取中间值:先对数组进行排序,然后中间的那个数一定是多数元素
  3. 摩尔投票法:一种线性时间($O(n)$)和常数空间求解多数元素的算法,简单来说,两两删除数组中不同的元素,最终剩下的一定是多数元素,需要维护一个元素和一个计数器。C++实现如下:

    public int majorityElement(vectirs<int>& nums){
      int num = nums[0];
      int count = 1;
      for(int i=1; i<nums.size(); i++){
        if(num == nums[i]) count++;
        else{
          count--;
          if(count ==0){
            i++;
            num = nums[i];
            count = 1;
          }
        }
      }
      
      return num;
    }

[最长上升子序列] -- 动态规划算法

【问题描述】

【解法思路】

  1. 暴力遍历(时间复杂度$O(2^n)$,我好傻)

    class Solution {
    public:
        int lengthOfLIS(vector<int>& nums) {
            int max =0;
            longestlength(nums, max, 0, INT_MIN, 0);
            return max;
        }
    
        void longestlength(vector<int>& nums, int& max, int count, int temp, int num){
            for(int i=num; i<nums.size(); i++){
                if(temp<nums[i]){
                    longestlength(nums, max, count+1, nums[i], i+1);
                }
            }
            if(max<count) max=count;
        }
    };
  2. 动态规划(时间复杂度$O(n^2)$)

    class Solution {
    public:
        int lengthOfLIS(vector<int>& nums) {
            int len = nums.size();
            if(len==0) return 0;
            int max = 1;
    
            int count[len];
            for(int i=0; i<len; i++){
                count[i] = 1;
            }
    
            for(int i=0; i<len; i++){
                for(int j=0; j<i; j++){
                    if(nums[j]<nums[i] && (count[i]<count[j]+1)){
                        count[i] = count[j]+1;
                    }
                }
                if(count[i]>max)
                    max = count[i];
            }
    
            return max;
        }
    };
  3. 二分查找(时间复杂度$O(n\log n)$,将动态规划方法的内层循环改为二分查找)

[水壶问题]

【问题描述】

  • 有一个容量分别为x升和y升的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好z升的水?如果可以,最后请用以上水壶中的一或两个来盛放取得的k升水。
  • 可以:

    • 装满任意一个水壶;
    • 清空任意一个水壶;
    • 从一个水壶向另一个水壶倒水,直到装满或者倒空。
  • LeetCode 365. 水壶问题

【解法思路】

  1. BFS 广度优先搜索/DFS 深度优先搜索

    • (填满第一个桶,填满第二个桶,倒空第一个桶,倒空第二个桶,把第一个桶倒入第二个桶,把第二个桶倒入第一个桶)
    • 加上存储搜索过的状态,哦NO...
    • 时间复杂度$O(xy)$,空间复杂度$O(xy) $
  2. 裴蜀定理(贝祖定理)

    • 定理:若$a,b$是整数,且$\gcd(a,b)=d$,那么对于任何的整数$x,y$,有$ax+by$一定是$d$的倍数。
    • 此题,等价于求是否存在整数$a,b$使得$ax+by=z$,即,$z$是否是$x,y$的最大公约数的倍数。
    • 时间复杂度$O(\log(\min(x,y)))$,空间复杂度$O(1)$。
加油加油!
点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
一只编程熊 一只编程熊
4年前
ACM金牌选手整理的【LeetCode刷题顺序】
算法和数据结构知识结构图首先,了解算法和数据结构有哪些知识点,在学习中形成大局观,对学习和刷题十分有帮助。下面是我花了一天时间整理的算法和数据结构的知识结构,大家可以看看。<imgsrc"https://tva1.sinaimg.cn/large/008i3skNly1gsbvbwd5u1j30ys0u0tl6.jpg"alt"image202107
如何搞定力扣刷题?
好买网(www.goodmai.com)IT技术交易平台前言大家好,我是bigsai,好久不见!今天就给各位小伙伴分享我自己刷题力扣的一些小方法,不一定很有用但是可以参考,祝你更高效的变强!最近在一些群聊、私聊中遇到很多的一个问题就是:刷题,大家也都重视到算法刷题对冲击大厂的重要性,越来越多的人开始卷起来了!BA321C5AFE6864CE60465A0E7
Stella981 Stella981
4年前
Github最强算法刷题笔记.pdf
资料一昨晚逛GitHub,无意中看到一位大佬(https://github.com/halfrost)的算法刷题笔记,感觉发现了宝藏!有些小伙伴可能已经发现了,但咱这里还是忍不住安利一波,怕有些小伙伴没有看到。关于算法刷题的困惑和疑问也经常听朋友们提及。这份笔记里面共包含作者刷LeetCode算法题后整理的数百道题,每道题均附有详细题
Stella981 Stella981
4年前
LeetCode算法题
这是悦乐书的第258次更新,第271篇原创<br/01看题和准备今天介绍的是LeetCode算法题中Easy级别的第125题(顺位题号是551)。您将获得一个表示学生出勤记录的字符串。该记录仅包含以下三个字符:'A':缺席。'L':迟到。'P':在场。如果学生的出勤记录不超过一个“A”(缺席)或超过两个
Wesley13 Wesley13
4年前
2020字节高频算法题
字节跳动现在是非常火热的哈,小伙伴们都极为关注。每天都有许多人在面试,有很多童鞋在牛客网写面经,阅读量都非常高。大家都知道字节跳动面试的特色哈,面试必定是要手撕算法的哈~总结了最近两月字节跳动提前批的算法题,大都数都是leetcode上的原题哈,也有一部分是剑指offer上的原题。有需要的小伙伴可以关注下哈。leetcode1
Stella981 Stella981
4年前
Leetcode Index
序:  用于记录刷题过程中难度较大或思路怪异的题目,对于常规难度一般的题就不写入我的博客了,关于效率仅是提交时击败的百分比,可能会随时间波动,仅供参考,算法优劣以时间复杂度和空间复杂度为基准。欢迎留言讨论。题目序号难度效率Leetcode42.TrappingRainWater(https://www.oschina.
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
4年前
LeetCode.1128
这是小川的第394次更新,第428篇原创<br/01看题和准备今天介绍的是LeetCode算法题中Easy级别的第259题(顺位题号是1128)。给定多米诺骨牌列表,当且仅当(ac且bd)或(ad且bc),dominoesia,
Wesley13 Wesley13
4年前
LeetCode刷题实战61:旋转链表
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选!今天和大家聊的问题叫做旋转链表,我们先来看题面:https://leetcodecn.com/problems/rotatelist/Give
Stella981 Stella981
4年前
LeetCode.1029
这是小川的第383次更新,第412篇原创<br/01看题和准备今天介绍的是LeetCode算法题中Easy级别的第245题(顺位题号是1029)。公司计划采访的人数为2N。将第i个人飞往城市A的费用是i0,将第i个人飞到城市B的费用是费用i1。返回将
码影寻踪
码影寻踪
Lv1
有的东西终究还是要失去,那我宁愿从来都未拥有过。
文章
4
粉丝
0
获赞
0