空间复杂度

十种排序算法

不羁的心 提交于 2020-03-18 17:36:29
3 月,跳不动了?>>> 排序 冒泡排序 排序过程 1、已知数组的长度为n,假定排序的总趟数为t,则t=n-1 2、第i趟(i取值范围[1,n-1])从第0个元素开始直到第n-i个元素,逐一向后每两个相邻的元素相互比较交换,保证最大(或者最小)值在后面 3、i++之后重复第二步 时间复杂度 最坏:n(n^2) 最好:n(n) 空间复杂度 一次基础临时变量赋值,所以空间复杂度为O(1) 稳定性 相邻数据之间的交换,所以是【稳定排序】 代码实现 public List<Integer> sort(List<Integer> list) { int size = 0; if(list == null || (size = list.size()) <= 1){ return list; } //总趟数 int t = size - 1; for (int i = 1; i <= t; i++) { boolean sorted = true; for (int j = 0; j < size - i; j++) { if (list.get(j) <= list.get(j + 1)) { continue; } //前面的比后面的大,需要交换 Integer temp = list.get(j); list.set(j, list.get(j + 1)); list.set(j + 1

数组中相同的数

怎甘沉沦 提交于 2020-02-25 19:32:00
给定一个升序数组1,元素有重复,对每个元素算一下平方后得到新的数组2, 问数组2中不相同的元素共有多少个?给出算法和空间复杂度,要求尽量优化 时间复杂度为O(n)空间复杂度为O(1) public int repeat ( int [ ] num ) { int left = 0 ; int right = num . length - 1 ; int count = 0 ; //先判断本身的重复项,然后再判断对称重复项 while ( left < right ) { while ( left + 1 <= right && num [ left ] == num [ left + 1 ] ) { count ++ ; left ++ ; } while ( right - 1 >= left && num [ right ] == num [ right - 1 ] ) { count ++ ; right -- ; } if ( left < right ) { int x = num [ left ] ; int y = num [ right ] ; if ( x + y == 0 ) { count ++ ; left ++ ; right -- ; } else if ( x + y < 0 ) { left ++ ; } else { right -- ; } }

基础算法——数据排序——冒泡

匆匆过客 提交于 2020-01-30 00:08:22
刚看完洛谷网课回放,开始点懵。 以下总结,笔记整理(有点累了,内容简略,见谅)。 冒泡排序 每一次操作,从左往右扫这个数组;若a[i]>a[i+1],将其交换,重复n次,数组有序。 代码(懂意思就好,大量省略):void bubbleSort() { for(int i=1;i<=n;i++) for(int j=1;j<n;j++) if(a[j]>a[j+1]) swap(a[j],a[j+1]); } 时间复杂度:O(n*n); 空间复杂度:O(1)。 优点:简单明了,空间复杂度低,稳定。 缺点:效率较低,时间复杂度高。 来源: https://www.cnblogs.com/weijianzhen/p/12241753.html

Leetcode: Partition List

二次信任 提交于 2020-01-02 01:13:16
思路: 1. 空间复杂度为 o(n) 解法. 创建两个链表, 分别记录大于 x 和小于 x 的节点, 最后合并 2. o(1) 的空间复杂度解法. 四个指针, 分别指向小于 x 部分链表的头, 尾, 指向大于 x 部分链表的头, 尾 总结: 1. 使用 dummyNode 减少判断 代码: class Solution { public: ListNode *partition(ListNode *head, int x) { ListNode *first, *second, *third, *fourth; if(head == NULL) return head; ListNode *cursor = head; ListNode *dummyNode = new ListNode(0); dummyNode->next = head; first = second = dummyNode; while(cursor && cursor->val < x) { second = cursor; cursor = cursor->next; } if(cursor && cursor->val >= x) { third = cursor; fourth = cursor; } while(cursor) { if(cursor->val < x) { second->next

leetcode刷到的大牛思路记录

淺唱寂寞╮ 提交于 2019-12-06 04:45:16
136 只出现一次的数字 自己一开始想到先排序,然后再遍历,结果错了。。。很容易也可以想到使用 Hash 映射来进行计算,遍历一次后结束得到结果,但是在空间复杂度上会达到 O(n) O ( n ),需要使用较多的额外空间 但是大牛想出异或的方法,也太牛了,学习到了! hashmap.keySet可以取出键值集合! 既满足时间复杂度又满足空间复杂度,就要提到位运算中的 异或运算 XOR ,主要因为异或运算有以下几个特点: 一个数和 0 做 XOR 运算等于本身:a⊕0 = a 一个数和其本身做 XOR 运算等于 0:a⊕a = 0 XOR 运算满足交换律和结合律:a⊕b⊕a = (a⊕a)⊕b = 0⊕b = b 故而在以上的基础条件上,将所有数字按照顺序做抑或运算,最后剩下的结果即为唯一的数字 时间复杂度:O(n),空间复杂度:O(1) 作者:guanpengchn 链接:https://leetcode-cn.com/problems/single-number/solution/hua-jie-suan-fa-136-zhi-chu-xian-yi-ci-de-shu-zi-b/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 来源: https://www.cnblogs.com/doyi111/p/11962528

极客时间-算法

微笑、不失礼 提交于 2019-12-05 20:30:34
1. 合格程序员的第一步:算法和数据结构 2. 如何事半功倍的学习算法和数据结构 1)怎样去学习精通一个领域? a. Chunk it up(切碎知识点:同事注意各个知识点的联系,辅助记忆) b. Deliberate practicing (刻意练习) c. Feedback (和别人的做饭比较,高手指点) 2)切题四件套 a. Clarification:明确题目的意思,一定搞明白问题是什么 b. Possible solutions:相处所有的解题方法,对比 - compare(time/space):对比时间复杂度和空间复杂度 - optimal(加强): c. Coding(多写) d. Test Cases:例子测试 来源: https://www.cnblogs.com/Jtianlin/p/11945488.html

必学十大经典排序算法,看这篇就够了(附完整代码/动图/优质文章)

送分小仙女□ 提交于 2019-12-05 07:44:00
原创:微信公众号 帅地 苦逼的码农 说明 十大排序算法 可以说是每个程序员都必须得掌握的了,花了一天的时间把代码实现且整理了一下,为了方便大家学习,我把它整理成一篇文章,每种算法会有简单的 算法思想描述 ,为了方便大家理解,我还找来了 动图演示 ;这还不够,我还附上了对应的 优质文章。 术语铺垫 有些人可能不知道什么是稳定排序、原地排序、时间复杂度、空间复杂度,我这里先简单解释一下: 1、稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,则为稳定排序。 2、非稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 可能不在 b 的前面,则为非稳定排序。 3、原地排序:原地排序就是指在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储空间进行比较和交换的数据排序。 4、非原地排序:需要利用额外的数组来辅助排序。 5、时间复杂度:一个算法执行所消耗的时间。 6、空间复杂度:运行完一个算法所需的内存大小。 另: 代码说明: 代码我自己写的,并且都是经过好几组数据测试通过,应该没啥问题,如有错,还请反馈下,谢谢。 图片说明: 图片和动画都是在百度搜索的,如有侵权,还望联系我删除,谢谢 1、选择排序 过程简单描述: 首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置

数据结构与算法——常用排序算法及其Java实现

邮差的信 提交于 2019-12-03 14:01:51
冒泡排序 原理: 依次比较相邻的两个数,将小数放在前面(左边),大数放在后面(右边),就像 冒泡 一样 具体操作: 第一趟,首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后,这样第一趟下来最大的数就在最后一位了。然后还是从第一个数开始重复第一趟步骤比较,但是这次不比较最后一个数了,第二趟结束后第二大的数就在倒数第二位......以此类推,直至全部排序完成。 所有代码 在这 ,关键代码如下: private static void sort(Comparable[] a) throws IllegalAccessException, InstantiationException { Object tmp; boolean noChange = false;//用来标识输入序列的排序情况, for (int i = 0;i<a.length-1 && !noChange;i++){ noChange = true;//如果某一趟没有交换,说明数据已经排好序无需再进行接下来的排序 for (int j=0;j<a.length-1-i;j++){ if(a[j].compareTo(a[j+1])>0){ tmp = a[j]; a[j] = a[j+1]; a[j+1] =

找到数组中唯一不重复的元素

坚强是说给别人听的谎言 提交于 2019-12-01 06:27:45
题目 Given a list of numbers, where every number shows up twice except for one number, find that one number. Example: Input: [4, 3, 2, 4, 1, 3, 2] Output: 1 Challenge: Find a way to do this using O(1) memory. 分析 要实现 O(1) 空间复杂度,能学到的一个简单办法是就地将数组排个序。然后2个2个的迭代,判断相邻2个元素是否相等,不相等则找到了唯一元素。 时间复杂度上升到了至少 O(nlogn). (但如果用计数排序的话,也许可以做到 O(n), 但是这样一来空间复杂度又不满足了)。 代码 def singleNumber(nums): nums.sort() for i in range(0, len(nums) - 1, 2): if nums[i + 1] != nums[i]: return nums[i] print singleNumber([4, 3, 2, 4, 1, 3, 2]) # 1 来源: https://www.cnblogs.com/new-start/p/11664655.html