算法
无尽的沉默
stay foolish,stay hungry
展开
-
BM2 链表内指定区间反转
描述将一个节点数为 size 链表 m位置到n 位置之间的区间反转,要求时间复杂度O(n)O(n),空间复杂度O(1)O(1)。例如:给出的链表为 1→2→3→4→5→NULL,m=2,n=4m=2,n=4,返回 1→4→3→2→5→NULL.数据范围: 链表长度 0 < size \le 10000<size≤1000,0 < m \le n \le size0<m≤n≤size,链表中每个节点的值满足 |val| \le 1000∣val∣≤1000...原创 2022-03-03 15:17:56 · 522 阅读 · 0 评论 -
NC7-买卖股票的最好时机
描述假设你有一个数组,其中第\ ii个元素是股票在第\ ii天的价格。你有一次买入和卖出的机会。(只有买入了股票以后才能卖出)。请你设计一个算法来计算可以获得的最大收益。示例1输入:[1,4,2]返回值:3示例2输入:[2,4,1]返回值:2java代码:import java.util.*;public class Solution { /** * * @param prices int整型一维...原创 2021-08-17 12:51:00 · 197 阅读 · 0 评论 -
Nc68-跳台阶
描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。示例1输入:2返回值:2示例2输入:7返回值:21java代码://动态规划,自底向上的方法计算public class Solution { public int jumpFloor(int target) { int[] dp=new int[target+1]; //代表第n个台阶的跳发的原创 2021-08-15 00:18:29 · 678 阅读 · 0 评论 -
NC1-大整数相加
描述以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。(字符串长度不大于100000,保证字符串仅由'0'~'9'这10种字符组成)示例1输入:"1","99"返回值:"100"说明:1+99=100 java代码:public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 计算两个数之和 * @param s str原创 2021-08-14 17:12:26 · 129 阅读 · 0 评论 -
NC33-合并两个有序的链表
描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。示例1输入:{1,3,5},{2,4,6}返回值:{1,2,3,4,5,6}java代码(有头结点) public class Solution { public ListNode Merge(ListNode list1,ListNode list2) {//带头结点 ListNode list=new ListNode(0); L原创 2021-08-12 00:50:54 · 174 阅读 · 0 评论 -
NC61-两数之和
描述给出一个整数数组,请在数组中找出两个加起来等于目标值的数,你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足index1 小于index2.。注意:下标是从1开始的假设给出的数组中只存在唯一解例如:给出的数组为 {20, 70, 110, 150},目标值为90输出 index1=1, index2=2示例1输入:[3,2,4],6返回值:[2,3]说明:因为 2+4=6 ,而 2的下标为2 , 4的.原创 2021-08-11 00:14:42 · 609 阅读 · 0 评论 -
NC88-寻找第K大的数
描述有一个整数数组,请你根据快速排序的思路,找出数组中第K 大的数。给定一个整数数组,同时给定它的大小n和要找的K ,请返回第 K大的数(包括重复的元素,不用去重),保证答案存在。要求时间复杂度 0(n)示例1输入:[1,3,5,2,2],5,3返回值:2示例2输入:[10,10,9,9,8,7,5,6,4,3,4,2],12,3返回值:9说明:去重后的第3大是8,但本题要求包含重复的元素,不用去重,所以输出9 ja.原创 2021-08-10 17:46:50 · 203 阅读 · 0 评论 -
NC119-最小的k个数
描述给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。0 <= k <= input.length <= 10000 0 <= input[i]<= 10000示例1输入:[4,5,1,6,2,7,3,8],4 返回值:[1,2,3,4]说明:返回最小的4个数即可,返回[1,3,2,4]也可以 示例2输入:[1],0返回值:[.原创 2021-08-09 00:22:35 · 119 阅读 · 0 评论 -
Nc105-二分查找-II
描述请实现有重复数字的升序数组的二分查找给定一个 元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的第一个出现的target,如果目标值存在返回下标,否则返回 -1示例1输入:[1,2,4,4,5],4返回值:2说明:从左到右,查找到第1个为4的,下标为2,返回2 示例2输入:[1,2,4,4,5],3返回值:-1示例3输入:[1,1,1,1,1],1返回值:.原创 2021-08-06 21:45:40 · 157 阅读 · 0 评论 -
NC78-反转列表
描述输入一个链表,反转链表后,输出新链表的表头。示例1输入:{1,2,3}返回值:{3,2,1}代码:struct ListNode* ReverseList(struct ListNode* phead ) { // write code here/* 不带头结点的 struct ListNode *newlist; newlist=NULL; struct ListNode *p; while(phead!=NULL)原创 2021-08-05 17:40:45 · 150 阅读 · 0 评论 -
牛客网NC112--进制转换
描述给定一个十进制数 M ,以及需要转换的进制数 N 。将十进制数 M 转化为 N 进制数。当 N 大于 10 以后, 应在结果中使用大写字母表示大于 10 的一位,如 'A' 表示此位为 10 , 'B' 表示此位为 11 。若 M 为负数,应在结果中保留负号。示例1输入:7,2返回值:"111"备注:M是32位整数,2<=N<=16.完整的java代码1:public class Demojinzhi { public st原创 2021-08-05 11:01:00 · 254 阅读 · 0 评论 -
最大子序列和的详解
一.问题例:求数列的最大子段和。 给定n个元素的整数列(可以能为负整数),a1,a2,…,an。求数列的字段,使其和最大。例如:当(a1, a2, a3, a4, a5, a6)=(-2, 11, -4, 13, -5, -2)时,最大子段和为sum(11-4+13)=20。二.解决方法我这里采用两种方法:①遍历的方法 ②分治法①遍历法原理分析:遍历该数组,每遍历一个i元素就判断temp+a[i]是否大于a[i],如果大于就更新temp=temp+a[i],否则temp=a[i],.原创 2020-11-29 19:48:44 · 2950 阅读 · 0 评论 -
大整数乘法的详解
一.问题由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数值的计算,于是产生了大数运算。尤其是乘法运算,下面就是大整数的乘法的过程(加 减法都一样的原理)。二.解决问题的方法方法一(传统的相乘逐步相加)乘法规律,一个数的第i位和另一个数的第j位相乘,一定会累加到结果的第i+j位,结果的数组一个数组元素存2位数,最后对结果整除得到进位,mod得到余数就是i+j位的数字,最后打印出来。对于大整数比较方便的输入方法是,.原创 2020-11-29 13:41:10 · 38636 阅读 · 14 评论 -
oj 合并有序序列
合并有序序列 Time Limit: 1000/1000MS (C++/Others)Memory Limit: 65536/65536KB (C++/Others)Problem Description有两个已排序好的序列A(长度为n1),B(长度为n2),将它们合并为一个有序的序列C(长度为n=n...原创 2020-11-25 22:27:38 · 278 阅读 · 0 评论 -
开灯变形问题(枚举法)
一、问题描述一排有N盏灯。事先给定每盏灯的初始状态(开着或关着),你的任务是计算出至少要切换多少盏灯的状态(把开着的关掉,或把关着的打开),使得这N盏灯交替地打开和关闭。Input输入文件中有多组测试数据,每行一组。首先是一个整数N(1<=N<=10000)表示灯的个数。然后是N个整数,表示这N盏灯的状态(1表示打开,0表示关闭)。测试数据直到文件尾。Output对每组测试数据输出一个至少需要切换的灯的数目,占一行。Sample Input9 1 0 0 1 1 1原创 2020-11-15 01:15:03 · 1646 阅读 · 0 评论 -
汽车穿越沙漠的算法问题(反推法)
一、问题描述 一辆吉普车来到1000km宽的沙漠边沿。吉普车的耗油量为1L/km,总装油量为500L。显然,吉普车必须用自身油箱中的油在沙漠中设几个临时 加油点,否则是通不过沙漠的。假设在沙漠边沿有充足的汽油可供使用,那么吉普车应在哪些地方、建多大的临的加油点,才能以最少的油耗穿过这块沙漠?二.问题分析1.为使油量消耗最少:每次出发的时候,汽车的装油量必须装满,所以每一个加油点的存油量都是汽车总装油量500L的整数倍,即500k2.从终点倒推考虑:如果从开始点考虑的话,由于很难确定它的第一原创 2020-11-13 22:18:08 · 5038 阅读 · 2 评论 -
利用快排查询无序数组第k位大的数
由于快速排序的partion函数返回值是基准值最终的位置,由此可以启发得出当这个位置刚好是第k位时,直接输出它下标对应的值,如果这个位置大于第k位时,则向该基准位置的左边递归;如果这个位置小于第k位时,则向该基准位置的右边递归;以上就是查找第k位的基本思想。这个算法时间复杂度是o(n),这时候有的人会说快排的时间复杂度是o(nlogn),为什么这个是o(n)呢?因为快排分别是对基准值两边进行递归操作的,然后再合并,合并操作时间复杂度o(1),每趟进行了n次交换,整个快速排序进行了logn趟,所以快速排序原创 2020-11-12 23:11:09 · 284 阅读 · 0 评论 -
快速排序的解析
快排原理每一趟快速排序,都是给基准值找其正确的位置(即寻找基准值最终的位置)该基准值的位置将一个无序的数组划分成两部分,前一部分均小于该基准值,后一部分均大于该基准值这就是一趟快速排序。快排的基本思想1. 在数组中选一个基准值(通常为数组第一个);2.分区过程,将比基准值大的数全放到它的右边,小于或等于它的数全放到它的左边;3.对于基准值左、右两边的数组,不断重复以上两个过程,直到每个子集只有一个元素,即为全部有序。接下来我用两种方法求解快速排序,其实它们的基本思想一样.原创 2020-11-10 21:57:15 · 638 阅读 · 1 评论 -
整数划分递归相关问题
算法设计----整数划分递归相关问题一.原问题整数划分,是指把一个正整数n写成如下形式:假设整数n,能被划分为i段n=a1+a2+...ai,其中ak为n中划分的最大整数(1<=ak<=n,1<=k<=i),则{a1,a2...ai}是n的ak的一个划分当n=6时我们可以获得以下这几种划分一共有11种分析:讨论整数n和划分的最大整数m的关系,可以分为以下几种情况: ...原创 2020-10-18 00:29:38 · 632 阅读 · 1 评论