算法
Sharknade
青菜豆腐,汝能持否?
展开
-
算法之最小栈求解
问题描述设计一个支持 push ,pop ,top 操作,并能提供一个获取最小值的方法getMin() 。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。解题思路创建一个类名为Stack,内部依赖两个栈结构(_stack 和_stageStack)。第一个用来存真实的数据;而第二个栈用来存储当前栈中的最小值。根据题意 新建头文件Stack.hpp,内容如下:#ifndef Sta原创 2020-09-30 13:21:28 · 222 阅读 · 0 评论 -
算法之循环有序列表的插入
题目描述解题思路由于是单向循环列表;能够保证每个元素都能遍历到要插入的元素,其插入的位置有两种情况a. 插入的位置 ,其前驱的值不大于 要插入的值 ,并且其后继的值要不小于当前值b.插入的位置, 不小于最大值或者不大于最小值#include "linked.hpp"void insert(Node * circle , int value){ if(circle == nullptr){ return; } //构建一个新的要插入的结点原创 2020-09-30 10:30:03 · 803 阅读 · 0 评论 -
算法之由两个栈组成队列
题目编写一个类,用两个栈实现队列,支持队列的基本操作(add、poll、peek)。解决方案根据栈的特点:先进后出。如果要想使用两个栈实现队列(先入先出特点)。只需要定义两个栈,分别命名为input和output。当input 表示入队,而output表示出队。关键点在于,只要当input中的元素要一次弹栈并压入output栈中。并且只要output中元素全出弹出后,才能够再次重复此操作具体代码如下所示://-------------- FILE QList.hpp ---------------原创 2020-09-27 14:56:28 · 101 阅读 · 0 评论 -
算法之使用递归实现栈翻元素转(C++)
问题描述通过递归函数实现栈元素翻转。例如:stack={1,2,3,4,5} ,将栈中的元素返回之后,变为stack={5,4,3,2,1};实现方式利用递归函数的调用栈存储栈中的每一个元素。只要实现先pop的元素,最后push即可。可以利用递归方法的调用栈,获取栈底元素。将stack中的数据,依次从栈底拿出。然后最后push到栈中即可。//方法声明//遍历打印栈中元素void printStack(stack<int>* _stack);//获取当前栈中,栈底的元素in原创 2020-09-23 10:34:38 · 504 阅读 · 0 评论 -
算法之单链表翻转
问题描述实现一个单链表的翻转。例如给定链表如下:1->2->3->4翻转后,结果为:4->3->2->1实现方式//翻转指针//实现思路:本人第一思路如此(比较笨拙)//三指针,分情况讨论的(流汗,估计面试的话,一轮游的水平)。int reverse(struct node** node){ struct node* tmp = (*node)->next; struct node* last = NULL;原创 2020-09-22 17:31:45 · 256 阅读 · 0 评论 -
算法之队列求第 k 个数
问题描述有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。例如,前几个数按顺序应该是 1,3,5,7,9,15,21。示例 1:输入: k = 5输出: 9算法实现class Solution { /** * 丑数 * 通过三个索引记录最小值 */ public int getKthMagicNumber(int k) { int[] arr = new int[k]; ar原创 2020-06-28 09:55:09 · 492 阅读 · 0 评论 -
算法之链表环路检测
问题描述给定一个有环链表,实现一个算法返回环路的开头节点。有环链表的定义:在链表中某个节点的next元素指向在它前面出现过的节点,则表明该链表存在环路。示例 1:输入:head = [1,2,3,4], pos = 1输出:tail connects to node index 1解释:链表中有一个环,其尾部连接到第二个节点。示例 2:输入:head = [5,3], pos = 0输出:tail connects to node index 0解释:链表中有一个环,其尾部连接到第原创 2020-06-28 09:30:10 · 506 阅读 · 1 评论 -
算法之链表求和
问题描述给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。示例:输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295输出:2 -> 1 -> 9,即912方法一class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) {原创 2020-06-24 14:47:38 · 557 阅读 · 0 评论 -
算法之链表分割链表
问题描述编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。示例:输入: head = 3->5->8->5->10->2->1, x = 5输出: 3->1->2->10->5->5->8解决办法class Solution { /**原创 2020-06-24 14:32:11 · 216 阅读 · 0 评论 -
算法之链表删除某中间结点
问题描述实现一种算法,删除单向链表中间的某个节点(即不是第一个或最后一个节点),假定你只能访问该节点。示例:输入:单向链表a->b->c->d->e->f中的节点c结果:不返回任何数据,但该链表变为a->b->d->e->f方法class Solution { public void deleteNode(ListNode node) { //删除当前节点node ,可以删去其下一个节点, //并将原创 2020-06-24 13:40:36 · 524 阅读 · 0 评论 -
算法之链表回文链表判断
问题描述编写一个函数,检查输入的链表是否是回文的。示例:输入: 1->2输出: false输入: 1->2->2->1输出: true方法一 /** * 要求时间复杂度为O(n),空间复杂度为O(1) *1.获取中间位置 * 获取中间位置,可以通过快慢指针实现 *2.从中间位置一次向两侧对比 * 从中间向两侧对比,需要将左半部分进行翻转,才能够实现 */ public boolean is原创 2020-06-24 10:04:01 · 151 阅读 · 0 评论 -
算法之链表获取倒数第K个值
问题描述实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。实例:输入: 1->2->3->4->5 和 k = 2输出: 4方法一class Solution { public int kthToLast(ListNode head, int k) { ListNode pre = head; List<Integer> values = new ArrayList(); while(p原创 2020-06-23 10:02:13 · 262 阅读 · 0 评论 -
算法之链表移除重复节点
问题描述编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。示例1:输入:[1, 2, 3, 3, 2, 1]输出:[1, 2, 3]示例2:输入:[1, 1, 1, 1, 2]输出:[1, 2]提示:链表长度在[0, 20000]范围内。链表元素在[0, 20000]范围内。方法一从第一个元素起,往后开始遍历,删除与之相等的元素class Solution { /** * 选择排序的思路 */ public ListNode rem原创 2020-06-23 09:46:26 · 319 阅读 · 0 评论 -
算法之字符串全排列(Java 递归与非递归的实现)
问题描述实现字符串的全排列,比如 用户输入“abcd”,则会输入如下4!个字符串a b c d ........d c b a 实现方式两种:递归非递归工具类方法/*** 遍历打印 字符串* @param str*/private static void printCharArr(char[] str) { for (char c : str) { System.out.print(c + " "); } System.原创 2020-05-11 10:19:04 · 855 阅读 · 0 评论 -
算法之字符串移位操作(Java)
问题描述给定字符数组“abcdef”, 输入移动位数(默认右侧移动)step,并将新的字符串输入。要求时间复杂度为O(n),空间复杂度O(1)。方法签名如下:private static void moveStr3(char[] str,int step);解决方法方法一暴力破解法(时间复杂度为O(kN)) /** * 暴力破解法 * 每次移动n步骤,累计移动k次 ...原创 2020-05-08 16:23:04 · 689 阅读 · 0 评论 -
算法问题动态规划之股票购买最大利润(Java)
public static void main(String[] args) { int[] stocks = {18,19,10,3,2,11,9,24,19}; //一次购买时 simpleStock(stocks); //三次购买时,打印最大利润值 MutiStock(stocks,3); //三次购买时,打印购买方案 MutiStock2(...原创 2020-02-06 11:23:27 · 782 阅读 · 0 评论 -
算法之动态规划最大递增子序列问题(Java语言)
求解数组的最大子序列的个数问题public static void main(String[] args) { int[] arr = {1,5,2,7,4,9,10,11,8,14,13}; System.out.println(maxLISCount1(arr)); System.out.println(maxLISCount2(arr));}/** * 最长递增子序列长...原创 2020-02-04 14:38:18 · 710 阅读 · 0 评论 -
算法之数组最大递增子数组(Java语言)
public static void main(String[] args) { int[] arr = {1,5,3,7,9,8}; int[] result = maxLISarr(arr); for (int i = 0; i < result.length; i++) { System.out.prin...原创 2020-02-03 22:25:22 · 414 阅读 · 0 评论 -
算法之树-二叉搜索树(C语言)
二叉查找树(二叉搜索树)定义:1. 左子树的节点均小于根节点2. 右子树的节点均不小于根节点3. 左右子树也满足上面的两个条件如下图所示:二叉查找树的查找1.如果当前节点小于查找值,则去当前节点的左孩子进一步查找2.如果当前节点大于查找值,则去当前节点的左孩子进一步查找3.如果当前节点为空或者等于查找值,则返回结果代码实现:/* 在root二叉搜索树中搜索值为val...原创 2020-01-05 11:22:49 · 314 阅读 · 0 评论 -
算法之数组最大递增子数组(C语言)
#include <stdio.h>/*遍历打印数组*/void printArr(int* arr,int len){ for (int i=0; i<len; i++) { printf(" %d ,",arr[i]); } printf("\n");}/*打印数组arr中的元素,从end-beforeOff的...原创 2019-12-31 21:38:10 · 532 阅读 · 0 评论 -
leecode刷题 之 40 Combination SumII
题意:给定一个集合C,与一个数值target,找出所有满足和为target的集合。(且每次求和时,C中的元素不能够重复使用)注意:1.集合中的所有元素都是正的 2.得出的集合不能够重复 例如: C = {10,1,2,7,6,1,5} target = 8 结果: [ [1,7] [2,6] [1,2,5] [1,1,6] ]具体实现代码如下:im...原创 2018-03-21 12:42:07 · 180 阅读 · 0 评论 -
leecode刷题 之 39 Combination Sum
题意:给定一个集合C,与一个数值Target。找出所有满足和为target的集合。 注意元素可以重复使用。 例如:C=[2,3,4,6,7] target = 7 结果为:[ [2,2,3],[3,4],[7]]public class Combination{ public static List<List<Integer>&g...原创 2018-03-21 11:01:28 · 165 阅读 · 0 评论