用栈实现队列
public class Stack2Queue {
Stack<Integer> stackBefore = new Stack<>();
Stack<Integer> stackAfter = new Stack<>();
public Stack2Queue() {
}
/**
* 入队列
*
* @param x 值
*/
public void push(int x) {
// 先放到 before 这个栈里面
stackBefore.push(x);
}
public int pop() {
// 出栈的时候先把 stackAfter 填满
in2Out();
return stackAfter.pop();
}
public int peek() {
if (stackAfter.isEmpty()) {
in2Out();
}
return stackAfter.peek();
}
public boolean empty() {
return stackAfter.isEmpty() && stackBefore.isEmpty();
}
private void in2Out() {
while (!stackBefore.isEmpty()) {
stackAfter.push(stackBefore.pop());
}
}
}
用队列实现栈
交换地址值
public class Queue2Stack {
/**
* 输入队列
*/
Queue<Integer> inQueue;
/**
* 输出队列
*/
Queue<Integer> outQueue;
public Queue2Stack() {
inQueue = new LinkedList<>();
outQueue = new LinkedList<>();
}
public void push(int x) {
inQueue.offer(x);
while (!outQueue.isEmpty()) {
inQueue.offer(outQueue.poll());
}
Queue<Integer> temp = outQueue;
outQueue = inQueue;
inQueue = temp;
}
public int pop() {
return outQueue.poll();
}
public int top() {
return outQueue.peek();
}
public boolean empty() {
return outQueue.isEmpty();
}
}
N 数之和
两数相加
题目 1. 两数之和
- 暴力破解
class Solution {
public int[] twoSum(int[] nums, int target) {
int len = nums.length;
for (int i = 0; i < len; i++) {
for (int j = i + 1; j < len; j++) {
if (nums[i] + nums[j] == target) {
return new int[]{i, j};
}
}
}
throw new RuntimeException("can not found this index");
}
}
- Hash 表法
我们一般使用空间换时间
,我们使用 Hash 表存储每一次遍历的值
class Solution {
public int[] twoSum(int[] nums, int target) {
int len = nums.length;
Map<Integer, Integer> hashMap = new HashMap<>(len - 1);
for (int i = 0; i < len; i++) {
int temp = target - nums[i];
if (hashMap.containsKey(target - nums[i])) {
return new int[]{hashMap.get(temp), i};
}
hashMap.put(nums[i], i);
}
throw new RuntimeException("can not found this index");
}
}
三数之和
题目 15. 三数之和
public static List<List<Integer>> threeSum(int[] nums) {
int n = nums.length;
Arrays.sort(nums);
List<List<Integer>> ans = new ArrayList<List<Integer>>();
// 枚举 a
for (int first = 0; first < n; ++first) {
// 需要和上一次枚举的数不相同
if (first > 0 && nums[first] == nums[first - 1]) {
continue;
}
// c 对应的指针初始指向数组的最右端
int third = n - 1;
int target = -nums[first];
// 枚举 b
for (int second = first + 1; second < n; ++second) {
// 需要和上一次枚举的数不相同
if (second > first + 1 && nums[second] == nums[second - 1]) {
continue;
}
// 需要保证 b 的指针在 c 的指针的左侧
while (second < third && nums[second] + nums[third] > target) {
--third;
}
// 如果指针重合,随着 b 后续的增加
// 就不会有满足 a+b+c=0 并且 b<c 的 c 了,可以退出循环
if (second == third) {
break;
}
if (nums[second] + nums[third] == target) {
List<Integer> list = new ArrayList<Integer>();
list.add(nums[first]);
list.add(nums[second]);
list.add(nums[third]);
ans.add(list);
}
}
}
return ans;
}