目录
1.线性表
List<Integer> list=new ArrayList<>();
List<Integer> list1=new LinkedList<>();
顺序表和链表的比较:
ArrayList 是一个可改变大小的数组.当更多的元素加入到ArrayList中时,其大小将会动态地增长.内部的元素可以直接通过get与set方法进行访问,因为ArrayList本质上就是一个数组.
LinkedList 是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList.
列举一题:合并数组
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
方法一:直接合并后排序(Arrays.sort采用的是快速排序)
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
for(int i=m,j=0;i<m+n;i++){
nums1[i]=nums2[j];
j++;
}
Arrays.sort(nums1);
}
}
方法二:双指针
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int p1 = 0, p2 = 0;
int[] sorted = new int[m + n];
int cur;
while (p1 < m || p2 < n) {
if (p1 == m) {
cur = nums2[p2++];
} else if (p2 == n) {
cur = nums1[p1++];
} else if (nums1[p1] < nums2[p2]) {
cur = nums1[p1++];
} else {
cur = nums2[p2++];
}
sorted[p1 + p2 - 1] = cur;
}
for (int i = 0; i != m + n; ++i) {
nums1[i] = sorted[i];
}
}
}
2.栈和队列
Java中实际上提供了java.util.Stack来实现栈结构,但官方目前已不推荐使用,而是使用java.util.Deque双端队列来实现队列与栈的各种需求.如下图所示java.util.Deque的实现子类有java.util.LinkedList和java.util.ArrayDeque.顾名思义前者是基于链表,后者基于数据实现的双端队列.
Deque关于栈的用法
//public interface Deque<E> extends Queue<E>
Deque<Integer> stack=new LinkedList<>();//栈
stack.push(2);//压栈
stack.pop();//出栈并删除元素
stack.isEmpty();//判断是否为空
stack.peek(); //获取栈顶
Deque关于Queue队列的用法
Deque<Integer> queue=new LinkedList<>();
queue.offer(2);//向队尾插入元素,失败返回false
queue.poll();//删除队头元素,失败返回full
queue.peek();//获取队头元素,不删除
双头队列Deque的用法和Stack与Queue的比较
栈的经典题目:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
class Solution {
public boolean isValid(String s) {
int n=s.length();
if(n%2==1)
return false;
Map<Character,Character> map=new HashMap<Character, Character>(){{
put(')','(');
put('}','{');
put(']','[');
}};
Deque<Character> stack=new LinkedList<>();
for (int i = 0; i <n; i++) {
char c=s.charAt(i);
if(map.containsKey(c)){
if(stack.isEmpty()||stack.peek()!=map.get(c)){
return false;
}
stack.pop();
}
else {
stack.push(c);
}
}
return stack.isEmpty();
}
}