- 1.实现一个支持动态扩容的数组
基本思路:当元素数量等于数组大小时,如果继续添加元素,则将数组容量扩大为原来的两倍;如果元素个数达到数组容量的1/4时,将数组容量收缩为原来的1/2。
public class ResizingArray<Integer>{
private int[] a = new int[];
private N = 0;
private void resize(int max){
int [] temp = new int[max];
for(int i = 0; i < N; i++)
temp[i] = a[i];
a = temp;
}
public void push(int item){
if(N == a.length)
resize(2*a.length);
a[N++] = item;
}
public int pop(){
int item = a[--N];
a[N] = null;
if(N > 0 && N == a.length/4)
resize(a.length/2);
return item;
}
}
- 2.实现一个大小固定的有序数组,支持动态增删改操作
基本思路:新建一个有序的大小固定的数组,删除一个数据时,可以使用二分查找,找到对应的位置,删除之后,将后边的数据按顺序前移一个位置;增加一个元素的时候,比较增加的元素是否比原数组中的边界值大或者小,如果增加的数据在区间范围内,则删除对应方向的边界值(方向按照要求选取),找到对应的位置之后,先将目标位置后边数据后移一个位置,留出空位,然后插入对应的数据; - 3.实现两个有序数组合并为一个有序数组
代码:
public class MergeTwoSortedArrays {
public static int[] merge(int[] a, int[] b) {
if(a == null)
return b;
if(b == null)
return a;
int len_a = a.length;
int len_b = b.length;
int[] c = new int[len_a + len_b];
int i = 0, j = 0, k = 0;//分别代表数组a ,b , c 的索引
while (i < len_a && j < len_b) {
if (a[i] < b[j])
c[k++] = a[i++];
else
c[k++] = b[j++];
}
while (i < len_a)
c[k++] = a[i++];
while (j < len_b)
c[k++] = b[j++];
return c;
}
}
Leetcode 1.Two Sum
LeetCode 15.Three Sum
LeetCode 169. Majority Element