
数据结构和算法相关
知耻而后勇
小宇~~~
这个作者很懒,什么都没留下…
展开
-
lee122买卖股票的最佳时机 I、II golang
买卖股票的最佳时机 I/*Question description:给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格原创 2020-06-11 19:01:12 · 265 阅读 · 0 评论 -
golang之leetcode33 旋转数组求值实现
题目:假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。求解思路:由题可知,有序,不重复数组,查询数组中等于某值的index, 复杂度为O(log n) ,联想到了二分查找法。众所周知,二分查找必须是在有序数据里面进行。但原创 2020-06-04 18:52:23 · 273 阅读 · 0 评论 -
golang之栈实现
stack API为压栈、弹栈、栈是否为空、查看栈顶元素(peek),查看栈中数据的数量、Flush(清空栈)栈的实现底层数据结构可以使用数组也可以使用链表:数组实现栈和链表实现的栈的插入、查询、拿取数据的复杂度都为1。数组栈的代码package stackimport "fmt"/** 数组栈,每次插入数据,即压栈,都放入数组的最后一个元素,取的时候,从最后一个元素取,复杂度都是O(1).* Author:sxy*/type Stack struct { data []int原创 2020-06-03 00:15:39 · 636 阅读 · 0 评论 -
golang之给定一个链表,删除链表的倒数第 n 个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点,这个n保证是有效的,有两种方法:1)第一种方法: 遍历两遍先遍历这个链表,假设得到了这个链表的长度是L, 那么我们要删除的节点的index即是L-n+1;再次遍历这个链表,找到要删除节点的前一个节点,删除这个节点就好了。2)第二种方法:遍历一遍采用两个指针,因为要删除的是这个链表倒数n个节点,先让一个指针走n个位置,之后再用一个指针,从头开始和前面的指针一起走;当前面的指针走到最后一个节点,后走的指针即是要删除的节点的前一个位置,删原创 2020-06-01 18:15:45 · 574 阅读 · 0 评论 -
golang之链表环的检测实现
判断链表中是否有环package other_pratice/**** 判断链表中是否有环** Author: sxy */// 两种解发// 1.快、慢指针法:// 快指针一次走两格,慢指针一次走一格;如果不存在环,快指针指向nil时,// 表示已经遍历完毕;如果存在环,则这两个指针会相遇.func LinkedLoopDetection(node *NodeList) bool { if node == nil || node.next == nil { re原创 2020-05-29 23:10:07 · 377 阅读 · 0 评论 -
基于快排求无序数组的第K大元素
package other_pratice/*** 怎么最快的求无序数组的第K大元素。** Author:sxy*/// 我们知道快排的排序是从大到小,还是从小到大取决于分区那个函数是如何写的,本题是在数组中寻找第几大元素// 所以需要在数组的大小的顺序要是从大到小// 快速排序每次排序完找的 基准点即是第几大元素。// 如果 如果count==基准点+1;则基准点即是第几大元素; 如果count<基准点+1,在左边找; 如果count>基准点+1大于在右边找。原创 2020-05-27 23:00:13 · 176 阅读 · 0 评论 -
golang之快排实现(最傻的和原地排序)
golang之快排实现(最傻的和原地排序)package sort/*** 最傻的QuikSort和基于原地的QuikSort** Author:sxy */func QuickSort(arr []int) { quickSort(arr, 0, len(arr)-1)}// 基于分治思想,即需要递归,递归退出条件,当start>=end,就退出。// 递推公式,即每次取一个临界点,小于这个临界点,放左边,大于这个临界点的放数组右边。// partition函数每次原创 2020-05-27 22:57:51 · 301 阅读 · 0 评论 -
golang之反转单链表实现
1.给定一个链表,将链表的值进行反转???有如下两种方式:1.遍历法2.递归法代码实现如下package other_praticeimport ( "fmt" "strconv")type ListNode struct { next *ListNode val int}func NewListNode(val int) *ListNode { return &ListNode{next: nil, val: val}}// 递归的方式// 递归的原创 2020-05-26 23:56:23 · 708 阅读 · 0 评论 -
golang之单链表和双链表实现
实现单链表、双向链表,增删操作单链表实现package linkedListimport "fmt"/**** 实现单链表(可以完成增,删,查)* 增加分为:在指定的节点前增加,在指定的节点后增加,在链表的尾部/头部插入节点;* 删除分为:删除指定的节点;* Author: sxy */// ps: 对于循环单链表而言,只需要将尾节点指向首节点即可。type Node struct { next *Node val int}type LinkedList struc原创 2020-05-26 18:08:49 · 285 阅读 · 0 评论 -
golang之约瑟夫环实现
1.约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知 n 个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为 k 的人开始报数,数到 m 的那个人出圈;他的下一个人又从 1 开始报数,数到 m 的那个人又出圈;依此规律重复下去,直到剩余最后一个胜利者。package other_praticetype Child struct { next *Child val int}func NewChild(val int) *Child { return &Child{ne原创 2020-05-25 23:18:33 · 339 阅读 · 0 评论 -
数组之golang实现(1)
1.实现一个支持动态扩容的数组满足的功能:增(从指定位置插入,从尾部插入)、删,查。因为数组需要保证数据是连续的,所以当删除,和插入时,需要做数据搬移。相关实现代码如下:package arrayimport ( "errors" "fmt")/**** 实现一个大小固定的有序数组,支持动态增删改操作。* Author: sxy*/type array struct { data []int length int // 数组目前存放的数据长度,已经初始化的数据。}原创 2020-05-25 17:55:44 · 241 阅读 · 0 评论