2016. 增量元素之间的最大差值
难度简单67
给你一个下标从 0 开始的整数数组 nums
,该数组的大小为 n
,请你计算 nums[j] - nums[i]
能求得的 最大差值 ,其中 0 <= i < j < n
且 nums[i] < nums[j]
。
返回 最大差值 。如果不存在满足要求的 i
和 j
,返回 -1
。
示例 1:
输入:nums = [7,1,5,4] 输出:4 解释: 最大差值出现在 i = 1 且 j = 2 时,nums[j] - nums[i] = 5 - 1 = 4 。 注意,尽管 i = 1 且 j = 0 时 ,nums[j] - nums[i] = 7 - 1 = 6 > 4 ,但 i > j 不满足题面要求,所以 6 不是有效的答案。
示例 2:
输入:nums = [9,4,3,2] 输出:-1 解释: 不存在同时满足 i < j 和 nums[i] < nums[j] 这两个条件的 i, j 组合。
示例 3:
输入:nums = [1,5,2,10] 输出:9 解释: 最大差值出现在 i = 0 且 j = 3 时,nums[j] - nums[i] = 10 - 1 = 9 。
代码在最后
目录
解题思路
如何保存 两个数 相减的结果。
***********
***********
思路为先把array转化为list,用list的add()方法添加元素,再把list转化为array。
一、数组
二、集合
三、数组和集合的区别
代码
1.遇到的问题。
一般数组是不能添加元素的,因为他们在初始化时就已定好长度了,不能改变长度。
但有个可以改变大小的数组为ArrayList,即可以定义一个ArrayList集合,然后用add(element)方法往里添加元素即可,还可add(index,element)往指定下标处添加元素;例子如下:
List
list.add(1);
list.add(2);
list.add(3);
list.add(2,4);
System.out.println(list);
List是一个接口,而ArrayList 是一个类。 ArrayList 继承并实现了List。
List list = new ArrayList();
这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。而ArrayList list=new ArrayList();创建一对象则保留了ArrayList的所有属性。
List 接口的大小可变数组的实现,位于API文档的java.util.ArrayList
每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。
但这儿会有一个陷阱盲区,在把array转化为list的过程中,使用的asList()方法会返回一个final的,固定长度的ArrayList类,并不是java.util.ArrayList,直接这样利用它进行add()或remove()是无效的。
List
list=Arrays.asList(sz);
list.add(5);
那应该怎么做呢,在定义list的时候就直接对array进行转化,代码如下:
数组 转 List:使用 Arrays.asList(array) 进行转换。
List 转 数组:使用 List 自带的 toArray() 方法。
a.数组 -> 集合
Integer []sz={3,2};
List
list.add(1,5);
Integer[] nsz=new Integer[list.size()];
list.toArray(nsz);
System.out.println(Arrays.toString(nsz));
b.集合-> 数组*****************************************************************************************************************
这两个方法都是将列表List中的元素转导出为数组,不同的是,toArray()方法导出的是Object类型数组,而toArray[T[] a]方法导出的是指定类型的数组。
List接口的toArray()方法就是直接调用Arrays.copyOf(elementData, size),将list中的元素对象的引用装在一个新的生成数组中。
object数据类型是dataframe中特殊的数据类型,当某一列出现数字、字符串、特殊字符和时间格式两种及以上时,就会出现object类型,即便把不同类型的拆分开,仍然是object类型.
如下replace()函数改变数据类型后,用astype()函数再转化一次才能将object格式转化,但有的时候不用.
Arrays.toString
如果想要把数组中的内容打印出来,直接使用toString方法只会打印出数组的地址,因此需要使用Arrays的toString方法,可以从其内部实现中看出来,该方法支持入参可以是long,float,double,int,boolean,byte,object型的数组
数组不是面向对象的,存在明显的缺陷,集合完全弥补了数组的一些缺点,比数组更灵活更实用,可大大提高软件的开发效率而且不同的集合框架类可适用于不同场合。
具体如下:
1)数组的效率高于集合类.
2)数组能存放基本数据类型和对象,而集合类中只能放对象。
3)数组容量固定且无法动态改变,集合类容量动态改变。
4)数组无法判断其中实际存有多少元素,length只告诉了array的容量。
5)集合有多种实现方式和不同的适用场合,而不像数组仅采用顺序表方式。
6)集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性调用即可实现各种复杂操作,大大提高软件的开发效率。
数组是java语言内置的数据类型,他是一个线性的序列,所有可以快速访问其他的元素,数组和其他语言不同,当你创建了一个数组时,他的容量是不变的,而且在生命周期也是不能改变的,还有JAVA数组会做边界检查,如果发现有越界现象,会报RuntimeException异常错误,当然检查边界会以效率为代价。
JAVA还提供其他集合,list,map,set,他们处理对象的时候就好像这些对象没有自己的类型一样,而是直接归根于Object,这样只需要创建一个集合,把对象放进去,取出时转换成自己的类型就行了。
一、数组声明了它容纳的元素的类型,而集合不声明。
二、数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。而集合是可以动态扩展容量,可以根据需要动态改变大小,集合提供更多的成员方法,能满足更多的需求。
三、数组的存放的类型只能是一种(基本类型/引用类型),集合存放的类型可以不是一种(不加泛型时添加的类型是Object)。
四、数组是java语言中内置的数据类型,是线性排列的,执行效率或者类型检查都是最快的。
import java.util.ArrayList;
import java.util.List;
public class complex{
public static void main(String[] args) {
int[] nums ={7,1,5,4,3};
int n = nums.length;
List list = new ArrayList();// to use put sum = nums[j] - nums[i]
for(int i = 0;i <= n-2;i++){
for(int j = i + 1;j <= n-1;j++){
list.add(nums[j] - nums[i]);
}
}
System.out.println("List`s size = "+ list.size());
System.out.println("list:");
System.out.print(list);
// to get the max numbers. list -> array
Integer[] ans = list.toArray(new Integer[0]);
System.out.println();
System.out.println("array`s length ="+ans.length);
System.out.println("Array:");
for (int i = 0 ;i < ans.length ;i ++ ){
System.out.print(ans[i]+",");
}
//The Max . support the ans[0] is Max
for (int j = 1;j < ans.length;j++){
if(ans[0] < ans[j]){
int temp = ans[0];
ans[0] = ans[j];
ans[j] = temp;
}
}
System.out.println();
System.out.println("The Max Number is:");
System.out.println(ans[0]);
}
}