文章

每日LeetCode 88-93

2021.4.8 ・ 共 1208 字,您可能需要 3 分钟阅读

Tags: LeetCode

斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 01 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1

给你 n ,请计算 F(n)

class Solution {
    public int fib(int n) {
        if (n <= 1) {
            return n;
        }
        int i = 0;
        int j = 0;
        int k = 1;
        for (int index = 2; index <= n; index++) {
            i = j;
            j = k;
            k = i + j;
        }
        return k;
    }
}

给定一个单词,你需要判断单词的大写使用是否正确。

我们定义,在以下情况时,单词的大写用法是正确的:

  1. 全部字母都是大写,比如"USA"。
  2. 单词中所有字母都不是大写,比如"leetcode"。
  3. 如果单词不只含有一个字母,只有首字母大写, 比如 “Google”。

否则,我们定义这个单词没有正确使用大写字母。

示例 1:

输入: "USA"
输出: True
class Solution {
    public boolean detectCapitalUse(String word) {
        int n = word.length();
        if (n <= 1) {
            return true;
        }
        int count = 0;
        boolean first = false;
        if (word.charAt(0) >= 'A' && word.charAt(0) <= 'Z'){
            first = true;
        }
        for (int i = 0; i < n; i++) {
            if (word.charAt(i) >= 'a' && word.charAt(i) <= 'z'){
                count ++;
            }
        }
        if (count == n || (first && count + 1 == n)|| count == 0) {
            return true;
        }
        return false;
    }
}

给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。

示例:

输入:

   1
    \
     3
    /
   2

输出:
1

解释:
最小绝对差为 1,其中 2 和 1 的差的绝对值为 1(或者 2 和 3)。
class Solution {
    int pre = -1;
    int ans = Integer.MAX_VALUE;

    public int getMinimumDifference(TreeNode root) {
        dfs(root);
        return ans;
    }

    public void dfs(TreeNode root) {
        if (root == null) {
            return;
        }
        dfs(root.left);
        if (pre == -1) {
            pre = root.val;
        } else {
            ans = Math.min(ans, Math.abs(pre - root.val));
            pre = root.val;
        }
        dfs(root.right);
    }
}

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。

示例 : 给定二叉树

          1
         / \
        2   3
       / \     
      4   5    

返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

class Solution {
    int ans;

    public int diameterOfBinaryTree(TreeNode root) {
        depth(root);
        return ans;
    }

    public int depth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int left = depth(root.left);
        int right = depth(root.right);
        ans = Math.max(ans, left + right);
        return Math.max(left, right) + 1;
    }
}

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

示例:

输入:"Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"
class Solution {
    public String reverseWords(String s) {
        StringBuffer sb = new StringBuffer();
        int n = s.length();
        int i = 0;
        while (i < n) {
            int start = i;
            while (i < n && s.charAt(i) != ' ') {
                i++;
            }
            int end = i;
            for (; end > start; end--) {

                sb.append(s.charAt(end - 1));
            }
            sb.append(' ');
            i++;
        }
        sb.delete(sb.length() - 1, sb.length());
        return sb.toString();
    }
}

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

进阶:

  • 你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
class Solution {
    public int[] searchRange(int[] nums, int target) {
        if (nums.length == 0) {
            return new int[]{-1, -1};
        }
        int first = firstSearch(nums, target);
        if (first == -1) {
            return new int[]{-1, -1};
        }
        int last = lastSearch(nums, target);
        return new int[]{first, last};

    }
    public int firstSearch(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            int mid  = left + (right - left) / 2;
            if (nums[mid] == target) {
                right = mid - 1;
            }
            else if (nums[mid] < target) {
                left = mid + 1;
            }
            else {
                right = mid - 1;
            }
        }
        if (left < nums.length && nums[left] == target)
            return  left;
        return -1;
    }
    public int lastSearch(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            int mid  = left + (right - left) / 2;
            if (nums[mid] == target) {
                left = mid + 1;
            }
            else if (nums[mid] < target) {
                left = mid + 1;
            }
            else {
                right = mid - 1;
            }
        }
        if (right < nums.length && nums[right] == target)
            return  right;
        return  -1;
    }    
}