/**
* @author :彭先生
*/
public class Algorithm {
public static void main(String[] args) {
System.out.println("使用双指针算法实现:去除重复之后得到最大下标:" + doublePointer(new int[]{0,1,2,2,3,3,4}));
System.out.println("使用二分查找算法实现:开平方根后得到最接近的正整数部分:" + binarySearch(26));
System.out.println("使用牛顿迭代实现:开平方根后得到最接近的正整数部分:" + newtonIteration(25, 26));
System.out.println("使用线性扫描算法;求出一个数组中由三个数值组成的最大乘积:" + linearScan(new int[]{1,2,3,4,5,6}));
}
/**
* 双指针算法
*/
public static int doublePointer(int[] args){
if(args == null || args.length == 0){
return 0;
}
//j=慢指针,i=快指针12334
int j = 0;
for (int i = 1; i < args.length; i++) {
if(args[i] != args[j]){
j++;
args[j] = args[i];
}
}
return j;
}
/**
* 二分查找算法
* @param x
* @return
*/
public static int binarySearch(int x){
int index = -1, left = 0, right = x;
while (left <= right){
int min = left + (right-left)/2;
if(min * min <= x){
index = min;
//向右边移动一位
left = min + 1;
}else{
//向左边移动一位
right = min - 1;
}
}
return index;
}
/**
* 牛顿迭代算法
* @return
*/
public static int newtonIteration(double n, int x){
double v = (x / n + n) / 2;
if(v == n){
return (int) v;
}
return newtonIteration(v, x);
}
/**
* 线性扫描
* @return
*/
public static int linearScan(int[] args){
//两个最小值,处理有负数的情况,负负得正
int min1 = Integer.MAX_VALUE,min2 = Integer.MAX_VALUE;
int max1 = Integer.MIN_VALUE,max2 = Integer.MIN_VALUE,max3 = Integer.MIN_VALUE;
for (int arg : args) {
if(arg < min1){
min2 = min1;
min1 = arg;
}else if(arg < min2){
min2 = arg;
}
if(arg > max1){
max3 = max2;
max2 = max1;
max1 = arg;
}else if(arg > max2){
max3 = max2;
max2 = arg;
}else if(arg > max3){
max3 = arg;
}
}
return Math.max(min1 * min2 * max3, max1 * max2 * max3);
}
}
双指针、二分查找、牛顿迭代、线性扫描算法
最新推荐文章于 2024-10-16 00:00:43 发布