数组array从0开始记录,设长度为length,第一个为array[0],最后一个为array[length-1]。
数组中有用数据的个数为size,size可能和length不一样,可能100的空间只用了10。
查找元素
对数组进行遍历,从array[0]到array[size-1],找到与等待查找元素key相同的元素,返回位数。
public static int findElement(int[] arr, int size, int key){
for(int i = 0;i < size;i++){
if(arr[i]==key){
return i;
}
}
return -1;
}
增加元素到有序表中(升序)
将插入位置后的元素整体后移,将给定元素插入数组对应位置中,要考虑插在数组首部、尾部和中间的情况。
public static int addElement(int[] arr,int size,int element){
if(size>=arr.length){//数组已满,无法插入
return -1;
}
int index = size;
for(int i = 0;i < size;i++){
if(element<arr[i]){
index = i;
break;
}
}
for(int j = size;j>index;j--){
arr[j]=arr[j-1];
}
arr[index] = element;
return index;
}
删除元素
先找到该元素,在进行删除。
public static int removeElement(int[] arr,int size,int key){
int index = -1;
for(int i = 0; i < size; i++){
if(arr[i]==key){
index = i;
break;
}
}
if(index!=-1){
for(int j = index; j < size-1;j++){
arr[j]=arr[j+1];
}
size--;
}
return size;
}
判断数组是否为单调数组
单调数组的定义为:
对于一个数组A,对于任意i<=j,均有A[i]<=A[j],数组A为单调递增;对于任意i<=j,均有A[i]>=A[j],数组A为单调递减。需要判断是否为升序和是否为降序。
public static boolean isMonotonic(int[] nums){
int len = nums.length - 1;
boolean inc = true, dec = true;
for(int i = 0; i < len;i++){
if(nums[i] < nums[i+1]){//判断是否为降序
dec = false;
}
if(nums[i] > nums[i+1]){//判断是否为升序
inc = false;
}
}
return inc||dec;//判断是否有序
}
在有序数组中给出目标值的索引,没有则给出目标值按顺序插入应在的索引位置。
单调数组查询,考虑使用二分法提高效率。
public static int searchInsert(int[] nums, int target){
int n = nums.length;
int left = 0, right = n - 1, ans = n;
while(left<=right){
int mid = (left + right)>>1;
if(target <=nums[mid]){
ans = mid;
right = mid - 1;
}else{
left= mid+1;
}
}
}
合并两个递增数组nums1和nums2到nums1中,数据个数为m和n,合并数组仍未递增数组。
若从数组首部开始进行合并,不方便,所以从数组尾部开始进行合并。
public static void merge(int[] nums1,int m,int[] nums2,int[] n){
int length = m + n - 1;
int len1 = m - 1,len2 = n -1;
while(len1>=0&&len2>=0){
if(nums1[len1]>=nums2[len2]){
nums1[length--] = nums1[len1--];
}else{
nums1[length--] = nums2[len2--];
}
}
while(len1!=-1) nums1[length--]=nums1[len1--];
while(len2!=-1) nums2[length--]=nums2[len2--];
}