博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数组中后面元素与前面元素的最大差值
阅读量:6573 次
发布时间:2019-06-24

本文共 3164 字,大约阅读时间需要 10 分钟。

求数组中两个元素差的最大值(后面的元素减去前面的元素)O(N)时间复杂度O(1)空间复杂度 题目:在数组中找到两个元素,计算后面的元素减去前面的元素的差。求出所有差的最大值。 (你可以认为你在炒股票,买入价格和卖出价格就是你的盈利)
//数组A[0...n] , 对于0<=i
<=n, 找出A[j]-A[i]的最大值 public class MaxDifference {
public static void main(String[] arg) {
int[] a = {12, 20, 23, 1, 2, 5, 7, 10}; //动态规划 System.out.println(maxDifference(a)); //后面减前面, 最大差值 //动态规划 int[] b = {13, 20, 23, 1, 2, 5, 7, 10}; System.out.println("动态规划" + maxDifference1(b)); //暴力搜索 System.out.println("暴力搜索: " + maxDifference2(a)); System.out.println("暴力搜索: " + maxDifference2(b)); //转化法 System.out.println("转化法: " + maxDifference4(a)); } //自底向上动态规划: O(n) //后面的数减去前面的数 public static int maxDifference(int[] a){
int minLeft = a[0];//默认最小的值 int maxDiff = a[1] - a[0]; //初始最大差值 for(int i = 2; i < a.length; i++) {
if(a[i - 1] < minLeft)//得到i之前数组的最小值 {
minLeft = a[i - 1]; } if(a[i] - minLeft > maxDiff)//获取最大差值 {
maxDiff = a[i] - minLeft; //用当前值减去当前值之前的最小值, 得到最大差值 } } return maxDiff; } //前面的数减去后面的数 public static int maxDifference1(int[] a){
int maxLeft = a[0];//默认最大的值 int maxDiff = a[0] - a[1]; //初始最大差值 for(int i = 2; i < a.length; i++) {
if(maxLeft < a[i - 1])//得到i之前数组的最大值 {
maxLeft = a[i - 1]; } if(maxLeft - a[i] > maxDiff)//获取最大差值 {
maxDiff = maxLeft - a[i]; //用当前值之前的最大值减去当前值, 得到最大差值 } } return maxDiff; } //分治法: 最大值和最小值都在左边数组中, 最大值最小值都在右边数组中, 最大值最小值分别位于左边数组或者右边数组中 //O(nlgn) public static int maxDifference3(int[] a){
return 0; } //转换法 /* 1、有一数组array[n],数组长度为n 2、构建一个长度为n-1的辅助数组array2[n-1],且array2[i] = array[i] - array[i+1]; (0<=i
i),即array[i] + array2[i+1] + ... + array2[j], 有(array[i] - array[i+1]) + (array[i+1] -array[i+2]) + ... + (array[j] - array[j+1]) = array[i] - array[j+1] 分析至此,发现数组中最大的数对之差(即array[i] - array[j+1])其实是辅助数组array2中最大的连续子数组之和。 */ public static int maxDifference4(int[] a){
//int[] b = Arrays.copyOf(a, a.length); //对a进行深拷贝, 长度可以自定义 int[] temp = new int[a.length - 1]; for (int i = 0; i < temp.length; i ++){
temp[i] = a[i+1] - a[i]; } int sum = 0; for (int i = 0; i < temp.length; i ++){
if (sum <= 0){
sum = temp[i]; }else {
sum += temp[i]; } } return sum; } //暴力搜索 O(n^2) public static int maxDifference2(int[] a){
int max = 0; for (int i = 0; i < a.length - 1; i ++){
for (int j = i + 1; j < a.length; j ++){
if (a[j] - a[i] > max){
max = a[j] - a[i]; } } } return max; } //寻找下标差值最大的两个数 //动态规划 }

转载于:https://www.cnblogs.com/kexianting/p/8744241.html

你可能感兴趣的文章
设置分录行按钮监听事件
查看>>
C Primer Plus 第5章 运算符、表达式和语句 5.2基本运算符
查看>>
蓝牙手柄按键码
查看>>
redis启动失败
查看>>
Navicat for PostgreSQL 怎么维护数据库和表
查看>>
java并发库之Executors常用的创建ExecutorService的几个方法说明
查看>>
Spring框架错误之org.springframework.beans.factory.BeanCreationException
查看>>
23种设计模式(1):单例模式
查看>>
socket 编程入门教程(五)UDP原理:4、“有连接”的UDP
查看>>
linux sort 命令详解
查看>>
Jquery获取iframe中的元素
查看>>
Laravel 学习笔记5.3之 Query Builder 源码解析(下)
查看>>
Struts2简单入门实例
查看>>
Android应用及应用管理
查看>>
2012CSDN年度博客之星评选http://vote.blog.csdn.net/item/blogstar/xyz_lmn
查看>>
Linux系统与网络服务管理技术大全(第2版)
查看>>
window下配置定时任务实现类似linux的cron定时任务
查看>>
铁道部否认被中铁工程等十多家公司老总蹲点讨债
查看>>
js事件---事件流
查看>>
我的友情链接
查看>>