绳子覆盖的点

给定一个数组int[]points 代表点,再给一个绳子长度length=n,求绳子最多能覆盖多少个点。两端被覆盖被计算在内。

思路1:points排序,然后一个小贪心,绳子的右端压在一个点上(没必要压在两个点中间),然后根据绳子长度能算出来左端的点,用二分查points的位置
思路2:双指针滑动窗口,LR指针间的距离小于绳子长度时,R右移,否则L右移,记录最大间隔。

交换字符

一个数组只包含两种字符A和B,想让A全挪到左边,B全挪到右边,但只能在相邻字符间交换,至少需要多少次?

二叉树还原

  1. private TreeNode build(String[] preArray, int preStart, int preEnd, String[] inArray, int inStart, int inEnd){
  2. if (preStart > preEnd || inStart > inEnd) return null;
  3. int index = 0 , rootVal = Integer.valueOf(preArray[preStart]);
  4. for (int i = 0; i < inArray.length; i++) {
  5. if (Integer.valueOf(inArray[i]) == rootVal){
  6. index = i;
  7. break;
  8. }
  9. }
  10. int inNumbers = index - inStart;
  11. TreeNode root = new TreeNode(rootVal);
  12. root.left = build(preArray,preStart+1,preStart+inNumbers,inArray,inStart,index-1);
  13. root.right = build(preArray,preStart+inNumbers+1,preEnd,inArray,index+1,inEnd);
  14. return root;
  15. }