题目

1) 给定一个数组,可以将任意一个数字标记为红色或者蓝色,使得所有红色数字递增,蓝色数字递减;
判断是否可以将所有数字都染色
例子:
输入:

数组 【7 4 1 3 2 5 6】

输出:

字符串 Yes

解释

降序数组
升序数组
7 4 2 标记为蓝色 为降序
1 3 5 6 标记为红色 为升序

解答

  1. public class blueRed {
  2. public static void main(String[] args) {
  3. int[] arr = new int[]{7, 4, 1, 3, 2, 5, 6};
  4. System.out.println(new blueRed().isFinish(arr));
  5. }
  6. public boolean isFinish(int[] arr) {
  7. boolean red1 = dfs(arr, 1, arr[0], Integer.MAX_VALUE); // 如果将第一个元素标为红色
  8. boolean blue1 =dfs(arr, 1, Integer.MIN_VALUE, arr[0]); // 如果将第一个元素标为蓝色
  9. return red1 || blue1;
  10. }
  11. /**
  12. * @param arr
  13. * @param index 当前搜索的数字索引
  14. * @param lower 升序序列的末尾
  15. * @param higher 降序序列的末尾
  16. */
  17. public boolean dfs(int[] arr, int index, int lower, int higher) {
  18. if (index >= arr.length) return true;
  19. System.out.println("当前的index "+arr[index]+" lower "+lower+" higher "+higher);
  20. if (arr[index] > lower) {
  21. System.out.println("当前"+arr[index]+"如果升序末尾的话");
  22. if (dfs(arr, index + 1, arr[index],higher)){
  23. System.out.println("最终 red "+arr[index]);
  24. return true;
  25. }
  26. }
  27. if (arr[index] < higher) {
  28. System.out.println("当前"+arr[index]+"如果降序末尾的话");
  29. if (dfs(arr, index + 1, lower, arr[index])){
  30. System.out.println("最终 blue "+arr[index]);
  31. return true;
  32. }
  33. }
  34. System.out.println(arr[index]+"不能继续标了 需回退上一个重新做决定");
  35. return false;
  36. }
  37. }

:::info 当前1如果降序末尾的话
当前的index 3 lower 4 higher 1
3不能继续标了 需回退上一个重新做决定
1不能继续标了 需回退上一个重新做决定
当前4如果降序末尾的话
当前的index 1 lower -2147483648 higher 4
当前1如果升序末尾的话
当前的index 3 lower 1 higher 4
当前3如果升序末尾的话
当前的index 2 lower 3 higher 4
当前2如果降序末尾的话
当前的index 5 lower 3 higher 2
当前5如果升序末尾的话
当前的index 6 lower 5 higher 2
当前6如果升序末尾的话
最终 red 6
最终 red 5
最终 blue 2
最终 red 3
最终 red 1
最终 blue 4
true :::