算法&数据结构
依旧风轻
葵花成海,你在不在
展开
-
寻找最近的公共父视图
循环嵌套迭代来查询最近的公共父视图, 时间复杂度。求两个视图的最近公共父视图。原创 2024-03-08 00:30:54 · 300 阅读 · 0 评论 -
规并排序(Swift版本)
时间复杂度为O(nlogn);适合大规模的数据排序;相比于冒泡排序、插入排序、选择排序这三种排序算法, 更加常用;用到了分治思想(即分而治之, 英文叫 “Divide and conquer”),非常巧妙;英文名称:Merge Sort;分治思想, 在很多领域都有广泛的应用,例如算法领域有分治算法(归并排序、快速排序都属于分治算法,二分法查找也是一种分治算法);分治算法一般都是用"递归"来实现的 (分治是一种解决问题的处理思想,递归是一种编程技巧);原创 2023-03-06 00:15:26 · 414 阅读 · 0 评论 -
232. 用栈实现队列
题目 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: * void push(int x) 将元素 x 推到队列的末尾 * int pop() 从队列的开头移除并返回元素 * int peek() 返回队列开头的元素 * boolean empty() 如果队列为空,返回 true ;否则,返回 false 说明: * 你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop fr原创 2022-04-17 18:04:59 · 60 阅读 · 0 评论 -
020. 有效的括号(Swift版)
题目 给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 1. 左括号必须用相同类型的右括号闭合。 2. 左括号必须以正确的顺序闭合。 算法实现 func isValid(_ s: String) -> Bool { let pairMap = ["(": ")", "{": "}", "[": "]"] as [Character: Character] var stack = [Cha原创 2022-04-17 00:06:40 · 2437 阅读 · 0 评论 -
判断链表中是否有环(Swift实现)
题目 // 给你一个链表的头节点 head ,判断链表中是否有环。 /** * Definition for singly-linked list. * public class ListNode { * public var val: Int * public var next: ListNode? * public init(_ val: Int) { * self.val = val * self.next = nil *原创 2022-04-06 23:54:43 · 2231 阅读 · 3 评论 -
Reverse All Words in a String 反转字符串中的所有单词
Reverse All Words in a String 反转字符串中的所有单词 解法1 class Solution { func reverseWords(_ s: String) -> String { if s.count <= 1 { return s } var result = "" let array = s.split(separator: " ") for charact原创 2020-05-12 17:10:29 · 164 阅读 · 0 评论 -
判断数组中是否存在两数之和等于目标值(Swift实现)
判断数组中是否存在两数之和等于目标值 show the code 代码展示 /* * 给定一个整数数组和一个目标值, 判断数组中是否有两个数之和等于目标值. */ private func twoSum(nums: [Int], _ target: Int) -> Bool { var set = Set<Int>(); for item in nums { if set.contains(target - item) { ret原创 2020-05-12 13:05:13 · 558 阅读 · 0 评论 -
1. 两数之和 (Swift版)
题目 Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the sa...原创 2019-03-03 00:40:41 · 191 阅读 · 0 评论 -
Implement Stack Using Swift 使用Swift实现栈
Implement Stack Using Swift 使用Swift实现栈 show the code 代码展示 /// 泛型版本的栈(imple by sqi in 2020.05.12) struct Stack<Element> { // 声明的同时进行初始化 var items = [Element]() // 是否为空 var isEmpty: Bool { return items.isEmpty } // 栈顶元素 var topI原创 2020-05-12 03:14:53 · 144 阅读 · 0 评论 -
原地排序的快排算法(Swift实现)
原地排序, 分界点选取最后一个元素 /// 原地分区函数(array: 待分区数组, p: 起始下标, r: 结束下标) private func partition(_ array: inout [Int], _ p: Int, _ r: Int) -> Int { let pivot = array[r] var i = p for j in p...r-1 { if array[j] < pivot { // 交换数组下标为原创 2020-05-11 03:46:31 · 527 阅读 · 0 评论 -
堆 Heap
堆 Heap Overview 概述 堆排序是一种原地的、时间复杂度为 O(nlogn)的排序算法; 尽管和快排算法的时间复杂度都是 O(nlogn),甚至堆排序比快速排序的时间复杂度还要稳定,但是,在实际的软件开发中,快速排序的性能要比堆排序好; 堆是一种特殊的数; 完全二叉树 堆中每一个节点的值都必须≥(大顶堆)或≤(小顶堆)其子树中每个节点的值 对于同一组数据,我们可以构建多种不同形态的堆; 堆的存储 Heap比较适合用数组来存储; 用数组来存储完全二叉树是非常节省存储空间的原创 2020-05-11 03:44:43 · 145 阅读 · 0 评论 -
(0001)删除字符串中的公共字符
(0001)删除字符串中的公共字符 题目: 输入两个字符串, 从第一字符串(下文称为x)中删除第二个字符串(下文简称为y)中所有的字符. 例如, 输入They are students.和aeiou, 则删除之后的第一个字符串变成Thy r stdnts. 解题思路 最简单的思路 两层循环遍历, 每遍历到字符串 y 中的一个字符, 就在字符串 x 中找到相同的字符, 找到之后删除它,并将字符串...原创 2020-04-28 02:24:49 · 249 阅读 · 0 评论 -
复杂度为O(n²)的经典排序算法
复杂度为O(n²)的经典排序算法 冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。 排序算法 时间复杂度 是否基于比较 冒泡, 插入, 选择 O(n²) YES 快排, 归并 O(nlogn) YES 桶, 计数, 基数 O(n) NO 排序算法的执行效率 最好情况、最坏情况、平均情况时间复杂度 在对同一阶时间复杂度的排序算法性能对比...原创 2020-04-27 17:32:22 · 555 阅读 · 0 评论 -
均摊时间复杂度
均摊时间复杂度 均摊时间复杂度,听起来跟平均时间复杂度有点儿像。对于初学者来说,这两个概念确实非常容易弄混。我前面说了,大部分情况下,我们并不需要区分最好、最坏、平均三种复杂度。平均复杂度只在某些特殊情况下才会用到,而均摊时间复杂度应用的场景比它更加特殊、更加有限。 /* * @功能 往数组中插入数据的功能。当数组满了之后,也就是代码中的 count == array.length 时,我们...原创 2020-04-07 00:02:19 · 274 阅读 · 0 评论 -
全面分析算法复杂度
在很多时候, 由于原始数据的不确定性, 算法的复杂度并不是唯一的, 可能具有多种不同的复杂度, 一个算法完整的时间复杂度分析包括如下: 最好情况时间复杂度(best case time complexity); 最坏情况时间复杂度(worst case time complexity); 平均情况时间复杂度(average case time complexity); 均摊时间复杂...原创 2020-04-06 22:49:23 · 997 阅读 · 0 评论 -
掌握算法复杂度分析
复杂度分析 > 数据结构和算法本身解决的是"快"(让代码运行的更快)和"省"(让代码更省存储空间)的问题; > 执行效率是算法一个非常重要的考量指标; > 如何衡量"执行效率" -> 时间, 空间复杂度; > 复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半; 大 O 复杂度表示法 大 O 时间复杂度实际上并不具体表示代码真正...原创 2020-04-06 16:00:27 · 257 阅读 · 0 评论