算法
gua_niu123
在孤独的生活里,做好一件事。
展开
-
二维数组查找元素
题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路一:遍历思路二:已知是有序,需求是查找是否存在---->类似二分查找。根据题目,如果拿数组中任意一个元素与目标数值进行比较,如果该元素小于目标数值,那么目标数值一定是在该元素的下方或右方,如果大于目标数值,那么目标数值一定在该元素的上方或者左方。 对于二分查找来说,每次比较只能移动一个指针,在二维原创 2021-04-02 09:40:58 · 577 阅读 · 2 评论 -
从n个数中找出3个最大的数
很多朋友面试遇到了这个问题,要最优算法,也就是说时间复杂度最低,循环和max()是行不通的:个人解如下:lst = []for i in num_list(): if len(lst) < 3: lst.append(i) else: if i > min(lst): lst.remove(min(lst)) lst.append(i)代码中用到了min(), 但是lst中 始终只有3个数,遍历一次的时间复杂度是3,所以算法的时间复杂度为3n,比n**3 快很多原创 2021-03-30 21:09:18 · 651 阅读 · 0 评论 -
经典监督学习算法——决策树
什么是决策树决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。简单的说就是你做出决定的一系列依据,下面的一个例子能帮助我们很好地理解决策树的概念决策树是一种树形结构,其生成过程是每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。通俗的说就是先选取一个对象的一个特征,在这转载 2021-01-23 21:48:44 · 992 阅读 · 0 评论 -
K近邻算法详解
K近邻算法详解KNN简介K最近邻(k-Nearest Neighbor,KNN),是一种常用于分类的算法,是有成熟理论支撑的、较为简单的经典机器学习算法之一。该方法的基本思路是:如果一个待分类样本在特征空间中的k个最相似(即特征空间中K近邻)的样本中的大多数属于某一个类别,则该样本也属于这个类别,即近朱者赤,近墨者黑。显然,对当前待分类样本的分类,需要大量已知分类的样本的支持,因此KNN是一种有监督学习算法。KNN原理上图中,所有样本可以使用一个二维向量表征。图中,蓝色方形样本和红色三角形样本为转载 2021-01-20 22:41:04 · 8393 阅读 · 1 评论 -
监督学习最常见的四种算法
在机器学习中,无监督学习(Unsupervised learning)就是聚类,事先不知道样本的类别,通过某种办法,把相似的样本放在一起归位一类;而监督型学习(Supervised learning)就是有训练样本,带有属性标签,也可以理解成样本有输入有输出。所有的回归算法和分类算法都属于监督学习。回归(Regression)和分类(Classification)的算法区别在于输出变量的类型,定量输出称为回归,或者说是连续变量预测;定性输出称为分类,或者说是离散变量预测。以下是一些常用的监督型学习方法。转载 2021-01-19 22:15:00 · 9199 阅读 · 1 评论 -
26. 删除排序数组中的重复项,你需要在 原地 删除重复出现的元素
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2],函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。你不需要考虑数组中超出新长度后面的元素。示例 2:给定 nums = [0,0,1,1,1,2,2,3,3,4],函数应该返回新的长度 5, 并且原数组 nums 的原创 2021-01-18 20:19:46 · 662 阅读 · 0 评论 -
21. 合并两个有序链表,将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的.
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例 1:输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]示例 2:输入:l1 = [], l2 = []输出:[]示例 3:输入:l1 = [], l2 = [0]输出:[0]提示:两个链表的节点数目范围是 [0, 50]-100 <= Node.val <= 100l1 和 l2 均按 非递减顺序 排列# Definition原创 2021-01-08 20:25:57 · 1200 阅读 · 1 评论 -
70. 爬楼梯 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1 阶 + 1 阶2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。3. 1 阶 + 1 阶 + 1 阶4. 1 阶 + 2 阶5. 2 阶 + 1 阶递归 解法def func(n) if n == 1 or n==2: retur原创 2021-01-06 21:23:45 · 1734 阅读 · 1 评论 -
66. 加一 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例 1:输入:digits = [1,2,3]输出:[1,2,4]解释:输入数组表示数字 123。示例 2:输入:digits = [4,3,2,1]输出:[4,3,2,2]解释:输入数组表示数字 4321。示例 3:输入:digits = [0]输出:[1]提示:1 <= digits原创 2021-01-06 20:57:22 · 1420 阅读 · 1 评论 -
67. 二进制求和 给你两个二进制字符串,返回它们的和(用二进制表示)。
给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字 1 和 0。示例 1:输入: a = “11”, b = “1”输出: “100”示例 2:输入: a = “1010”, b = “1011”输出: “10101”class Solution: def addBinary(self, a: str, b: str) -> str: a = eval('0b'+a) b = eval('0b'+b)原创 2021-01-05 22:33:06 · 2147 阅读 · 0 评论 -
给定一个仅包含大小写字母和空格 ‘ ‘ 的字符串 s,
给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。如果不存在最后一个单词,请返回 0 。说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。示例:输入: “Hello World”输出: 5class Solution: def lengthOfLastWord(self, s: str) -> int: s = s.strip() s_li原创 2021-01-05 22:18:47 · 3322 阅读 · 0 评论 -
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2示例 2:输入: [1,3,5,6], 2输出: 1示例 3:输入: [1,3,5,6], 7输出: 4示例 4:输入: [1,3,5,6], 0输出: 0class Solution: def searchInsert(self, nums: List[int], targ原创 2020-12-29 21:08:41 · 2598 阅读 · 1 评论 -
实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串,
实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。示例 1:输入: haystack = “hello”, needle = “ll”输出: 2示例 2:输入: haystack = “aaaaa”, needle = “bba”输出: -1说明:当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。对原创 2020-12-28 22:47:47 · 1414 阅读 · 0 评论 -
有效的括号栈匹配
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: “()”输出: true示例 2:输入: “()[]{}”输出: true示例 3:输入: “(]”输出: false示例 4:输入: “([)]”输出: false示例 5:输入: “{[]}”输出: trueclass Solution:原创 2020-12-26 22:45:41 · 429 阅读 · 0 评论 -
编写一个函数来查找字符串数组中的最长公共前缀。
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。示例 1:输入: [“flower”,“flow”,“flight”]输出: “fl”示例 2:输入: [“dog”,“racecar”,“car”]输出: “”解释: 输入不存在公共前缀。说明:所有输入只包含小写字母 a-z 。class Solution: def longestCommonPrefix(self, strs: List[str]) -> str: s原创 2020-12-23 22:49:23 · 1022 阅读 · 0 评论 -
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。class Solution: def reverse(self, x: int) -> int: re = ''原创 2020-12-22 22:34:24 · 934 阅读 · 0 评论 -
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: s = “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: s = “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是原创 2020-12-21 21:24:28 · 977 阅读 · 0 评论 -
两数之和:给定一个整数数组 nums 和一个目标值 target
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]class Solution: def twoSum(self, nums: List[int], target: int) -&g原创 2020-12-18 20:59:40 · 4089 阅读 · 1 评论 -
最长公共子串与子序列-动态规划(Python)
最长公共子串(The Longest Common Substring) LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为左上方的值加1,否则为0。然后求出对角线最长的1的序列,其对应的位置就是最长匹配子串的位置。def find_lcsubstr(s1, s2):#生成0矩阵,为方便后续计算,比字符串长度多了一行一列m=[[0 for i in range(len(s2)+1)] for j in range(原创 2020-12-07 23:19:00 · 533 阅读 · 1 评论 -
几种常见的排序算法
文章目录冒泡排序快速排序直接插入排序Shell排序简单选择排序(又称直接选择排序)堆排序归并排序计数排序基数排序桶排序常见排序算法一般分为以下几种:(1)非线性时间比较类排序:交换类排序(快速排序和冒泡排序)、插入类排序(简单插入排序和希尔排序)、选择类排序(简单选择排序和堆排序)、归并排序(二路归并排序和多路归并排序);(2)线性时间非比较类排序:计数排序、基数排序和桶排序。总结:(1)在比较类排序中,归并排序号称最快,其次是快速排序和堆排序,两者不相伯仲,但是有一点需要注意,数据初始排序状态对转载 2020-12-05 22:43:44 · 728 阅读 · 0 评论 -
计算n x m的棋盘格子, 沿着各自边缘线从左上角走到右下角,总共有多少种走法. 要求不能走回头路,即:只能往右和往下走,不能往左和往上走。
题目描述 :请编写一个函数(允许增加子函数),计算n x m的棋盘格子(n为横向的格子数,m为竖向的格子数)沿着各自边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。输入描述:输入两个正整数输出描述:返回结果示例:输入22输出6两种思路, 动态规划或者递归。动态规划这道题的动态规划解法较为简单, 利用的是子问题之间不独立,举个栗子, 在本题中, 即 3 x 4棋盘的走法数与 2 x 4 有关. 本题可以根据前两个阶段有原创 2020-12-03 22:53:06 · 1182 阅读 · 0 评论 -
求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1
求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1。输入描述:输入一个byte数字输出描述:输出转成二进制之后连续1的个数示例1输入35输出21说明3的二进制表示是11,最多有2个连续的1。5的二进制表示是101,最多只有1个连续的1。第一种思路:num = bin(int(input()))re = num[2::]num_list = re.split('0')n = 0for i in num_list:原创 2020-12-02 20:18:40 · 1012 阅读 · 1 评论