算法通关村第五关--白银挑战

用栈实现队列

算法通关村第五关--白银挑战_第1张图片

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());
        }
    }
}

用队列实现栈

算法通关村第五关--白银挑战_第2张图片

算法通关村第五关--白银挑战_第3张图片

交换地址值

算法通关村第五关--白银挑战_第4张图片

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. 两数之和

算法通关村第五关--白银挑战_第5张图片

  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");
    }
}
  1. 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. 三数之和

算法通关村第五关--白银挑战_第6张图片

    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
                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;
    }

你可能感兴趣的:(算法,算法,java,开发语言)