数组、链表、跳表
数组ArrayList 的特点:
- 增删复杂度高、查询复杂度低
链表
- 增删复杂度低、查询复杂度高
跳表
- 采用升维的思想,用空间换时间,在原有数组的基础之上,加了一层二级、三级、N级索引;
- redis数据库采用跳表实现。
主要优化思想:升维 + 空间换时间
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
class Solution {
public void moveZeroes(int[] nums) {
if (nums.length==0||nums.length==1) return;
int i=0;
int j=0;
int a;
for(i=0;i<nums.length;i++){
//找到非0元素,存储到 j 位置上,j是从 0开始依次+1的。达到了排序的目的
if (nums[i]!=0){
a=nums[j];
nums[j]=nums[i];
nums[i]=a;//如果确定 i!=j ,此处可以直接赋值为0
j=j+1;
}
}
}
}
解析:移动0,有两个解释,
- 从左向右,依次向后移动0
- 从左向右,依次向前移动非0元素。非0元素与前面0进行交换
解析中 j 代表的依次存放非0元素的位置,j有两种结果 j = i ,j<i;当 j = i时,交换数据对结果没有影响,j < i 交换数据时, num [ j ] 必然是0。