
算法
心寒丶
java后台,oracle数据库,前端全栈开发,三个臭皮匠,顶个诸葛亮,有问题咱一起解决!只要你问,只要我会(不会可以一起研究),倾囊相授
展开
-
java比较版本号大小
java比较版本号大小原创 2022-04-26 18:15:00 · 1304 阅读 · 0 评论 -
连续子数组的最大和
描述输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,子数组最小长度为1。求所有子数组的和的最大值。解题思路:暴力解除法,两次循环,分别求和,计算最大值 public int FindGreatestSumOfSubArray(int[] array) { //假设第一个数最大 int max=array[0]; for(int i=0;i<array.length;i++){ int sum=0; for(原创 2022-04-06 19:45:00 · 428 阅读 · 0 评论 -
字符串变形
字符串变形原创 2022-04-02 17:45:00 · 789 阅读 · 1 评论 -
最长公共前缀
最长公共前缀给你一个大小为 n 的字符串数组 strs ,其中包含n个字符串 , 编写一个函数来查找字符串数组中的最长公共前缀,返回这个公共前缀原创 2022-03-25 20:45:00 · 578 阅读 · 0 评论 -
判断是否回文数字
判断是否回文数字原创 2022-03-23 18:00:00 · 255 阅读 · 0 评论 -
反转数字算法
给定一个32位的有符号整数num,将num中的数字部分反转,最后返回反转的结果1.只反转数字部分,符号位部分不反转原创 2022-03-21 19:30:00 · 532 阅读 · 0 评论 -
不同路径的数目
描述一个机器人在m×n大小的地图的左上角(起点)。机器人每次可以向下或向右移动。机器人要到达地图的右下角(终点)。可以有多少种不同的路径从起点走到终点?解题思路先分析下,看下有没有什么规律,把表格以坐标形式记录从开头到第一行第二个:(1,1)>(1,2) 1种从开头到第二行第一个:(1,1)>(2,1) 1种从开头到第一行第三个:(1,1)>(1,2) >(1,3) 1种从开头到第三行第一个:(1,1)>(2,1) >(3,1) 1种原创 2022-03-18 17:15:00 · 363 阅读 · 0 评论 -
数组中出现次数超过一半的数字
描述给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。解题思路:可以假设第一个数为出现最多数,设置出现次数为1.依次与之后每个数比较,如果相等,则次数+1,不相等次数-1,只到减为0,赋值新的值public int MoreThanHalfNum_Solution(int [] array) { int temp=原创 2022-03-17 18:15:00 · 342 阅读 · 0 评论 -
买卖股票的最好时机
描述假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益1.你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖出一次,总共只能买入和卖出一次,且买入必须在卖出的前面的某一天2.如果不能获取到任何利润,请返回03.假设买入卖出均无手续费解题思路:可以分别拿第一天与之后每一天比较,第二天再与之后的每一天比较,依次进行,由此可以想到可以采用冒泡排序的方式,双重循环来完成public int ma原创 2022-03-16 18:30:00 · 287 阅读 · 0 评论 -
求平方根(二分法)
描述实现函数 int sqrt(int x). 计算并返回 x 的平方根(向下取整)解题思路:采用二分法,每次折中查找 public int sqrt (int x) { if(x<0) return 0; int left =1; int right=x; while(left<right){ int middle=(left+right)/2; if (middle * middle <= x && (mid原创 2022-03-15 20:00:00 · 415 阅读 · 0 评论 -
有效括号序列
描述给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列,括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。解题思路:要判断是否是有效括号,则首先需要判断第一个与最后一个是不是关闭的括号,然后再判断第二个与倒数第二个,依次进行,因此可以使用先进后出的栈来判断 public boolean isValid (String s) { Stack<Characte原创 2022-03-14 19:15:00 · 637 阅读 · 0 评论 -
合并两个有序的数组
描述给出一个有序的整数数组 A 和有序的整数数组 B ,请将数组 B 合并到数组 A 中,变成一个有序的升序数组解题思路:暴力解题法,先将B加入A数组之后,然后再排序 public void merge(int[] A, int m, int[] B, int n) { //先扩容 A = java.util.Arrays.copyOf(A, m + n); for (int i = 0; i < n; i++) {原创 2022-03-11 18:00:00 · 444 阅读 · 0 评论 -
跳台阶,有多少种跳法
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)原创 2022-03-10 21:00:00 · 465 阅读 · 0 评论 -
两数之和返回下标
描述给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。(注:返回的数组下标从1开始算起,保证target一定可以由数组里面2个数字相加得到)解题思路 :拿每个数与其之后的数进行相加,若等于目标值target则返回当前两个数 public int[] twoSum (int[] numbers, int target) { int[] sum = new int[2];原创 2022-03-09 20:15:00 · 461 阅读 · 0 评论 -
求最大公约数
描述如果有一个自然数 a 能被自然数 b 整除,则称 a 为 b 的倍数, b 为 a 的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。输入 a 和 b , 请返回 a 和 b 的最大公约数。解题思路:首先常规思路:找到两个较小的数,最大公约数小于等于较小的数,然后从较小的数倒叙循环下去,直到为0为止 public int gcd (int a, int b) { int max=0; int min=a&原创 2022-03-08 19:45:00 · 207 阅读 · 0 评论 -
判断是否为回文字符串
描述给定一个长度为 n 的字符串,请编写一个函数判断该字符串是否回文。如果是回文请返回true,否则返回false。字符串回文指该字符串正序与其逆序逐字符一致。数据范围:0 < n≤1000000解题思路:由题意可知:回文字符串指该字符串正序与其逆序逐字符一致,根据规则,判断字符串是否为“回文字符串”首先想到的是要拿第一个字符与最后一个字符比较,然后第二个字符与倒数第二个字符比较,第三个与倒数第三个字符比较......依次循环下去。 public boolean judge原创 2022-03-07 21:45:00 · 3061 阅读 · 0 评论 -
二维多项式计算
package ca.base;public class Polynomial2 { public static double polynomialCa(double[][] a, int m, int n, double x,double y) { //这里m是x的项数,n是y的项数 double result = 0.0; double temp; double tt = 1.0; for (int i = 0; i <.原创 2021-08-24 14:32:04 · 246 阅读 · 0 评论 -
一维多项式求值
如下案例为计算的值package ca.base;public class Polynomial { public static double polynomialCa(double a [],double x){ int i ; double result; result=a[a.length-1];//第一个原数 for(i=a.length-2;i>=0;i--){ System.out.println("result=result*x+a[i] ..原创 2021-08-24 11:17:33 · 129 阅读 · 0 评论 -
折半查找算法
折半查找(Binary Search)又称为二分查找,其要求数据序列呈线性结构,也就是经过排序的。对于没有经过排序的,可以通过上一章中的排序算法来进行预排序,然后执行折半查找操作。其算法的操作步骤如下:首先需要设三个变量lownum、midnum、highnum,分别保存数组元素的开始、中间和末尾的序号。接着进行以下判断:(1)如果序号为midnum 的数组元素的值与x相等,表示查找到了数据,返回该序号midnum。(2)如果x<a[midnum],表示要查找的数据x位于lownum与 mi原创 2021-08-24 09:07:58 · 2490 阅读 · 1 评论 -
顺序查找算法
顺序查找比较简单,其执行的操作是从数据序列中的第1个元素开始,从头到尾依此逐个查找,直到找到所要的数据或搜索完整个数据序列。顺序查找主要针对少量的、无规则的数据。对于包含n个数据的数据序列,使用顺序查找方法查找数据,最理想的情况是目标数据位于数组的第一个,这样比较1次就找到目标数据。而最差的情况是需比较完所有的n个数据才找到目标数据或者确认没有该数据。平均来说,比较次数为n/2次,效率是比较差的。package ca.search;import java.util.Scanner;publi原创 2021-08-24 08:37:09 · 1032 阅读 · 0 评论 -
概率算法(撒点法)
概率算法执行的基本过程如下:(1)将问题转化为相应的几何图形S,S的面积是容易计算的,问题的结果往往对应几何图形中某一部分S1的面积。(2)然后,向几何图形中随机撒点。(3)统计几何图形S中和S1中的点数。根据S的面积和S1面积的关系以及各图形中的点数来计算得到结果。(4)判断上述结果是否在需要的精度之内,如果未达到精度则进行执行步骤(2)。如果达到精度,则输出近似结果。案例:如蒙特卡罗概率算法计算π实例package ca.caldemo;import java.util.Scan.原创 2021-08-23 15:59:55 · 1119 阅读 · 0 评论 -
分治算法(找假币)
分治算法的基本思想是将一个计算复杂的问题分为规模较小,计算简单的小问题求解,然后综合各个小问题,而得到最终问题的答案。分治算法的执行过程如下:(1)对于一个规模为N的问题,若该问题可以容易地解决(比如说规模N较小),则直接解决;否则执行下面的步骤。(2)将该分解为M个规模较小的子问题,这些子问题互相独立,并且与原问题形式相同。(3)递归地解这些子问题。(4)然后,将各子问题的解合并得到原问题的解。使用分治算法需要待求解问题能够化简为若干个小规模的相同问题,通过逐步划分,能够达到一个易于求解的阶原创 2021-08-23 15:23:18 · 2449 阅读 · 0 评论 -
递归算法(兔子产仔问题)
递归算法就是在程序中不断反复调用自身来达到求解问题的方法。这里的重点是调用自身,这就要求待求解的问题能够分解为相同问题的一个子问题。这样,通过多次递归调用,便可以完成求解。递归调用是一个方法在其方法体内调用其自身的方法调用方式。这种方法也称为“递归方法”。在递归方法中,主调方法又是被调方法。执行递归方法将反复调用其自身。每调用一次就进入新的一层。方法的递归调用分两种情况:直接递归和间接递归。(1)直接递归,即在方法中调用方法本身。(2)间接递归,即间接地调用一个方法,如func_a调用func_b,原创 2021-08-23 15:07:03 · 1849 阅读 · 0 评论 -
穷举算法(鸡兔同笼问题)
穷举算法的基本思想就是从所有可能的情况中搜索正确的答案,其执行步骤如下:(1)对于一种可能的情况,计算其结果。(2)判断结果是否满足要求,如果不满足则进行执行第(1)步来搜索下一个可能的情况:如果满足要求,则表示寻找到一个正确的答案。在使用穷举算法时,需要明确问题的答案的范围,这样才可以在指定范围内搜索答案。指定范围之后,就可以使用循环语句和条件判断语句逐步验证候选答案的正确性,从而得到需要的正确答案。案例:如小时候遇到过的鸡兔同笼问题,鸡兔共有多少多少只,有多少多少脚,问鸡兔各多少只,原创 2021-08-23 14:15:35 · 3621 阅读 · 0 评论 -
选择排序详解
算法原理如下:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。时间复杂度选择排序的交换操作介于 0 和 (n - 1)次之间。选择排序的比较操作为 n (n - 1) / 2 次之间。选择排序的赋值操作介于 0 和 3 (n - 1) 次之间。比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+...+1=n*(n-1)/2。交.原创 2021-01-25 14:43:55 · 370 阅读 · 0 评论 -
希尔排序详解
算法原理如下:把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。时间复杂度①当文件初态基本有序时直接插入排序所需的比较和移动次数均较少。②当n值较小时,n和n²的差别也较小,即直接插入排序的最好时间复杂度O(n)和最坏时间复杂度O(n²)差别不大。③在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各...原创 2021-01-22 11:43:42 · 546 阅读 · 0 评论 -
插入排序详解
插入排序原理:插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程时间复杂度1.当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较N- 1次,时间复杂度为O(N);2.最坏的情况是待排序数组是逆序的,此时需要比较次数最多,总次数记为:1+2+3+…+N-1,所以原创 2021-01-21 16:01:55 · 2391 阅读 · 0 评论 -
冒泡排序详解
关于冒泡排序,相关的网站介绍也比较多,还是写个案例来帮助大家理解算法原理如下: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 时间复杂度 1.如果我们的数据正序,只需要走一趟即可完成排序。所需的比较次数C和记录移动次数M....原创 2021-01-21 11:25:44 · 5055 阅读 · 2 评论