每日刷题记录(二十一)

x33g5p2x  于2022-07-13 转载在 其他  
字(3.3k)|赞(0)|评价(0)|浏览(500)

第一题: 17. 电话号码的字母组合

LeetCode: 17. 电话号码的字母组合

描述:
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

解题思路:

  1. 首先使用哈希表将对应的数字和字符串放入哈希表中.
  2. 然后使用回溯
  3. 去遍历digits中数字对应的字符串, 然后进行拼接
  4. 当拼接的字符串长度和digits.length()一样之后, 添加到结果集中.

代码实现:

  1. class Solution {
  2. private List<String> list = new ArrayList<>();
  3. public List<String> letterCombinations(String digits) {
  4. if(digits.length() == 0) return list;
  5. Map<Integer,String> map = new HashMap<>();
  6. map.put(2,"abc");
  7. map.put(3,"def");
  8. map.put(4,"ghi");
  9. map.put(5,"jkl");
  10. map.put(6,"mno");
  11. map.put(7,"pqrs");
  12. map.put(8,"tuv");
  13. map.put(9,"wxyz");
  14. StringBuilder res = new StringBuilder();
  15. backtracking(digits,map,0,res);
  16. return list;
  17. }
  18. public void backtracking(String digits, Map<Integer,String> map, int index, StringBuilder res) {
  19. if(index == digits.length()){
  20. list.add(res.toString());
  21. return;
  22. }
  23. String str = map.get(digits.charAt(index) - '0');
  24. for (int i = 0; i < str.length(); i++) {
  25. res.append(str.charAt(i));
  26. backtracking(digits,map,index+1,res);
  27. res.deleteCharAt(res.length()-1);
  28. }
  29. }
  30. }

第二题: 108. 将有序数组转换为二叉搜索树

LeetCode: 108. 将有序数组转换为二叉搜索树

描述:
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

解题思路:

  1. 首先这里给的数组已经按升序排序了, 使用二分查找就可以找到每个根节点.
  2. 首先使用二分查找找到根节点, 再去找左子树, 找右子树.
  3. 递归去查找, 直到 left > right ,

代码实现:

  1. class Solution {
  2. public TreeNode sortedArrayToBST(int[] nums) {
  3. return ToBST(nums,0,nums.length-1);
  4. }
  5. public TreeNode ToBST(int[] nums, int left, int right){
  6. if(left > right) return null;
  7. int mid = left + (right - left) / 2;
  8. TreeNode root = new TreeNode(nums[mid]);
  9. root.left = ToBST(nums,left,mid-1);
  10. root.right = ToBST(nums,mid+1,right);
  11. return root;
  12. }
  13. }

第三题: 116. 填充每个节点的下一个右侧节点指针

LeetCode: 116. 填充每个节点的下一个右侧节点指针

描述:
给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

  1. struct Node {
  2. int val;
  3. Node *left;
  4. Node *right;
  5. Node *next;
  6. }

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。

初始状态下,所有 next 指针都被设置为 NULL。

解题思路:

  1. 使用层序遍历
  2. 把每一层的节点, 按顺序进行串联.
  3. 注意为空的情况 要进行判断.

代码实现:

  1. class Solution {
  2. public Node connect(Node root) {
  3. if(root == null) return null;
  4. Queue<Node> queue = new LinkedList<>();
  5. queue.offer(root);
  6. while(!queue.isEmpty()) {
  7. int size = queue.size();
  8. while(size != 0) {
  9. Node top = queue.poll();
  10. if(size != 1){
  11. top.next = queue.peek();
  12. }
  13. if(top.left != null) queue.offer(top.left);
  14. if(top.right != null) queue.offer(top.right);
  15. size--;
  16. }
  17. }
  18. return root;
  19. }
  20. }

第四题: 162. 寻找峰值

LeetCode: 162. 寻找峰值

描述:
峰值元素是指其值严格大于左右相邻值的元素。

给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。

你可以假设 nums[-1] = nums[n] = -∞ 。

你必须实现时间复杂度为 O(log n) 的算法来解决此问题。

解题思路:

  1. 由于时间复杂度的限制, 这里使用二分查找
  2. 如果 nums[mid] > nums[mid+1] , 峰值在左边, 让 right = mid
  3. 如果 nums[mid] < nums[mid+1], 峰值在右边, 让 left = mid + 1
  4. 循环去找, 直到 right <= left, 结束循环
  5. left下标就是峰值

代码实现:

  1. class Solution {
  2. public int findPeakElement(int[] nums) {
  3. int left = 0;
  4. int right = nums.length-1;
  5. while(left < right) {
  6. int mid = left + (right - left) / 2;
  7. if(nums[mid] > nums[mid+1]){
  8. right = mid;;
  9. }else{
  10. left = mid+1;
  11. }
  12. }
  13. return left;
  14. }
  15. }

第五题: 171. Excel 表列序号

LeetCode: 171. Excel 表列序号

描述:
给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。

解题思路:

  1. 这里相当于26进制转成10进制
  2. ans = (ans * 原进制数) + (10进制表示的数字) (ans初始为0)

代码实现:

  1. class Solution {
  2. public int titleToNumber(String columnTitle) {
  3. int ans = 0;
  4. for(int i = 0; i < columnTitle.length() ;i++) {
  5. ans =(ans * 26) + (columnTitle.charAt(i)-'A'+1);
  6. }
  7. return ans;
  8. }
  9. }

第六题: 172. 阶乘后的零

LeetCode: 172. 阶乘后的零

描述:
给定一个整数 n ,返回 n! 结果中尾随零的数量。

提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1

解题思路:

  1. 本题就是统计5的个数, 只有和5和5的倍数的数相乘才会出现0
  2. 这里就循环的去查看n里5个数

代码实现:

  1. class Solution {
  2. public int trailingZeroes(int n) {
  3. int count = 0;
  4. while( n / 5 != 0) {
  5. count += n/5;
  6. n /= 5;
  7. }
  8. return count;
  9. }
  10. }

相关文章