第34天--算法(牛客网剑指offer1)

1.JZ3 数组中重复的数字

public int duplicate (int[] numbers) {
  int L = 0;
  while(L < numbers.length) {
    if(numbers[L] == L) {
      L ++;
    }else if(numbers[numbers[L]] == numbers[L]) {
      return numbers[L];
    }else {
      swap(numbers,L,numbers[L]);
    }
  }
  return -1;
}
public void swap(int arr[],int x,int y) {
  int temp = arr[x];
  arr[x] = arr[y];
  arr[y] = temp;
}

2.JZ4 二维数组中的查找

public boolean Find(int target, int [][] array) {
  int M = array.length;
  int N = array[0].length;
  int i = M - 1;
  int j = 0;
  while(i >= 0 && j < N) {
    if(array[i][j] == target) {
      return true;
    }else if(array[i][j] > target) {
      i --;
    }else {
      j ++;
    }
  }
  return false;
}

3.JZ5 替换空格

public String replaceSpace (String s) {
  if(s == null || s.length() == 0) {
    return s;
  }
  char s1[] = s.toCharArray();
  StringBuilder sb = new StringBuilder();
  for(int i = 0;i < s1.length;i ++) {
    sb.append(s1[i] == ' ' ? "%20" : s1[i]);
  }
  return sb.toString();
}

4.JZ6 从尾到头打印链表

public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
  ArrayList<Integer> ls = new ArrayList<>();
  ListNode reverseListNode = new ListNode(-1);
  while(listNode != null){
    ListNode cur = listNode;
    listNode = listNode.next;
    cur.next = reverseListNode.next;
    reverseListNode.next = cur;
  }
  while(reverseListNode.next != null){
    ls.add(reverseListNode.next.val);
    reverseListNode = reverseListNode.next;
  }
  return ls;
}

5.JZ7 重建二叉树

public TreeNode reConstructBinaryTree(int [] pre,int [] vin) {

        HashMap<Integer,Integer> hm = new HashMap<>();

        for(int i = 0;i < vin.length;i ++) {

            hm.put(vin[i],i);

        }

        return process(pre,0,pre.length - 1,vin,0,vin.length - 1,hm);

    }

    public TreeNode process(int [] pre,int L1,int R1,int [] vin,int L2,int R2,HashMap<Integer,Integer> hm) {

        if(L1 > R1) {

            return null;

        }

        TreeNode res = new TreeNode(pre[L1]);

        if(L1 == R1) {

            return res;

        }

        int index = hm.get(pre[L1]);

        res.left = process(pre,L1 + 1,index - L2 + L1,vin,L2,index - 1,hm);

        res.right = process(pre,index - L2 + L1 + 1,R1,vin,index + 1,R2,hm);

        return res;

    }

 

6.JZ8 二叉树的下一个结点

public TreeLinkNode GetNext(TreeLinkNode pNode) {
  //1.有右子树,要找到右子树的最左节点
  if(pNode.right != null) {
    pNode = pNode.right;
    while(pNode.left != null) {
      pNode = pNode.left;
    }
    return pNode;
  }
  //2.没有右子树,且是父节点的左节点
  if(pNode.next != null && pNode.next.left == pNode) {
    return pNode.next;
  }
  //3.没有右子树,且是父节点的右节点
  if(pNode.next != null && pNode.next.right == pNode) {
    pNode = pNode.next;
    while(pNode.next != null && pNode.next.right == pNode) {
      pNode = pNode.next;
    }
    return pNode.next;
  }
  return null;
}

7.JZ9 用两个栈实现队列

Stack<Integer> stack1 = new Stack<Integer>();

Stack<Integer> stack2 = new Stack<Integer>();

public void push(int node) {

  while(!stack2.isEmpty()) {

         stack1.push(stack2.pop());

       }

       stack1.push(node);

       while(!stack1.isEmpty()) {

         stack2.push(stack1.pop());

        }

}

public int pop() {

  return stack2.pop();

 

}

8.JZ10 斐波那契数列

public int Fibonacci(int n) {

        if(n <= 0) {

            return 0;

        }

        if(n == 1 || n == 2) {

            return 1;

        }

        int dp[] = new int[n + 1];

        dp[1] = 1;

        dp[2] = 1;

        for(int i = 3;i < n + 1;i ++) {

            dp[i] = dp[i - 1] + dp[i - 2];

        }

        return dp[n];

}

9.JZ11 旋转数组的最小数字

public int minNumberInRotateArray(int [] nums) {

        if(nums == null || nums.length == 0) {

            return -1;

        }

        int ans = Integer.MAX_VALUE;

        int L = 0;

        int R = nums.length - 1;

        int M = 0;

        while(L <= R) {

            M = (L + R) >> 1;

            if(nums[L] == nums[M] && nums[M] == nums[R]) {

                ans = Math.min(ans,nums[L]);

                while(L < M && nums[L] == nums[M]) {

                    L ++;

                }

                if(L == M) {

                    L = M + 1;

                    continue;

                }

            }else {

                if(nums[M] > nums[L]) {

                    ans = Math.min(nums[L],ans);

                    L = M + 1;

                }else if(nums[M] < nums[L]) {

                    ans = Math.min(nums[M],ans);

                    R = M - 1;

                }else {

                    ans = Math.min(ans,nums[L]);

                    L = M + 1;

                }

            }

        }

        return ans;

}

10.JZ12 矩阵中的路径

public boolean hasPath (char[][] matrix, String word) {

        if(word == null || word.length() == 0) {

            return true;

        }

        char w[] = word.toCharArray();

        for(int i = 0;i < matrix.length;i ++) {

            for(int j = 0;j < matrix[0].length;j ++) {

                if(process(matrix,w,0,i,j)) {

                    return true;

                }

            }

        }

        return false;

}

public boolean process (char[][] matrix,char[] word,int index,int i,int j) {

        if(index == word.length) {

            return true;

        }else {

            if(i < 0 || j < 0 || i == matrix.length|| j == matrix[0].length || matrix[i][j] != word[index]) {

                return false;

            }else {

                char temp = matrix[i][j];

                matrix[i][j] = '0';

                boolean ans = process(matrix,word,index + 1,i + 1,j) ||

                        process(matrix,word,index + 1,i - 1,j) ||

                        process(matrix,word,index + 1,i,j + 1) ||

                        process(matrix,word,index + 1,i,j - 1);

                matrix[i][j] = temp;

                return ans;

            }

        }

}

posted @ 2022-02-23 17:07  现在开始努力  阅读(41)  评论(0)    收藏  举报