publicstaticvoidquickSort(int[] arr, int l, int r){ if (l >= r) { return; } int pivot = arr[l], i = l - 1, j = r + 1; while (i < j) { do i++; while(arr[i] < pivot); do j--; while(arr[j] > pivot); // 注意:重点在这里,要i < j的时候才需要swap,否则不需要!!! if (i < j) swap(arr, i, j); }
// 这种写法应该更加亲民一点,只是while循环多了一点内容。 publicstaticvoidquickSort(int[] arr, int l, int r){ if (l >= r) { return; } int i = l, j = r; while (i < j) { // 注意,这里一定得是j在前,i在后 while (i < j && arr[j] >= arr[l]) j--; while (i < j && arr[i] <= arr[l]) i++; swap(arr, i, j); } swap(arr, i, l); quickSort(arr, l, i - 1); quickSort(arr, i + 1, r); }
publicvoidmontonousStack(int[] nums){ Stack<Integer> stack = new Stack();
for (int i = nums.length; i >= 0; i--) { while (!stack.isEmpty() && stack.peek() < nums[i]) { System.out.printf("index %d left greater element is %d\n", stack.pop(), nums[i]); } stack.push(i); } while (!stack.isEmpty()) { System.out.printf("index %d left greater element is %d\n", stack.pop(), -1); } }
publicint[] minSlidingWindow(int[] nums, int k) { Deque<Integer> deque = new LinkedList(); int n = nums.length; // 这里用res数组来存储结果 int[] res = newint[n - k + 1]; for (int i = 0; i < n; i++) { // 如果当前队列里面存的数字过多,则将最前面的数字弹出,其实就是边界情况,当window里面数字全部都是升序的时候。注意判断是否为空! if (!deque.isEmpty() && i - k + 1 > deque.peekFirst()) { deque.pollFirst(); } // 将队尾的所有比当前元素大的全部pop出去,因为它们不可能为解。注意,是队尾!!!不是队首!!!而且要注意有等于的情况!!! while (!deque.isEmpty() && nums[deque.peekLast()] <= nums[i]) { deque.pollLast(); }
// 这里用数组来模拟双端队列,q就是这个队列,里面存的也是index int N = 100010, hh = 0, tt = -1; int[] q = newint[N];
publicint[] minSlidingWindow(int[] nums, int k) { int[] res = newint[nums.length - k + 1]; for (int i = 0; i < nums.length; i++) { // if (hh <= tt && i - k + 1 > q[hh]) hh++; while (hh <= tt && nums[q[tt]] >= nums[i]) tt--; q[++tt] = i; if (i >= k - 1) { res[i - k + 1] = nums[q[hh]]; } } return res; }
classSolution{ public List<Integer> preorderTraversal(TreeNode root){ Stack<TreeNode> stack = new Stack<TreeNode>(); List<Integer> list = new ArrayList<Integer>(); TreeNode node = root; stack.push(node);
while (!stack.isEmpty() && node != null) { node = stack.pop(); list.add(node.val); if (node.right != null) { stack.push(node.right); } if (node.left != null) { stack.push(node.left); } }
return list; } }
压栈的目的只是为了回溯找右节点,不是压左右子树,而是访问过的节点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classSolution{ public List<Integer> inorderTraversal(TreeNode root){ Stack<TreeNode> stack = new Stack<TreeNode>(); List<Integer> list = new ArrayList<Integer>(); TreeNode node = root;
classSolution{ public List<Integer> inorderTraversal(TreeNode root){ Stack<TreeNode> stack = new Stack<TreeNode>(); List<Integer> list = new ArrayList<Integer>(); TreeNode node = root;
classSolution{ public List<Integer> inorderTraversal(TreeNode root){ Stack<TreeNode> stack = new Stack<TreeNode>(); List<Integer> list = new ArrayList<Integer>(); TreeNode node = root;