LeetCode: 109. 有序链表转换二叉搜索树
描述:
给定一个单链表的头节点 head
,其中的元素 按升序排序 ,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。
class Solution {
public TreeNode sortedListToBST(ListNode head) {
if(head == null) return null;
if(head.next == null) return new TreeNode(head.val);
ListNode fast = head;
ListNode slow = head;
ListNode pre = null;
while(fast != null && fast.next != null) {
fast = fast.next.next;
pre = slow;
slow = slow.next;
}
pre.next = null;
TreeNode root = new TreeNode(slow.val);
root.left = sortedListToBST(head);
root.right = sortedListToBST(slow.next);
return root;
}
}
LeetCode: 112. 路径总和
描述:
给你二叉树的根节点 root
和一个表示目标和的整数 targetSum
。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum
。如果存在,返回 true
;否则,返回 false
。
叶子节点 是指没有子节点的节点。
class Solution {
public boolean hasPathSum(TreeNode root, int targetSum) {
if(root == null) return false;
if(root.left == null && root.right == null) {
if(root.val == targetSum) {
return true;
}else{
return false;
}
}
targetSum -= root.val;
return hasPathSum(root.left, targetSum) || hasPathSum(root.right,targetSum);
}
}
LeetCode: 179. 最大数
描述:
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数
(o2+o1).compare(o1+o2)
"0"
class Solution {
public String largestNumber(int[] nums) {
PriorityQueue<String> pq = new PriorityQueue<>((o1,o2) -> ((o2+o1).compareTo(o1+o2)));
for(int num : nums) {
pq.offer(num+"");
}
StringBuilder res = new StringBuilder();
while(!pq.isEmpty()) {
res.append(pq.poll());
}
if(res.charAt(0) == '0') return "0";
return res.toString();
}
}
LeetCode: 190. 颠倒二进制位
描述:
颠倒给定的 32 位无符号整数的二进制位。
提示:
res |= (n & 1) << (31-i)
public class Solution {
// you need treat n as an unsigned value
public int reverseBits(int n) {
int res = 0;
for(int i = 0; i < 32; i++) {
res |= (n & 1) << (31-i);
n>>=1;
}
return res;
}
}
LeetCode: 334. 递增的三元子序列
描述:
给你一个整数数组 nums
,判断这个数组中是否存在长度为 3
的递增子序列。
如果存在这样的三元组下标 (i, j, k)
且满足 i < j < k
,使得 nums[i] < nums[j] < nums[k]
,返回 true
;否则,返回 false
。
first = nums[0]
, second = Integer.MAX_VALUE
class Solution {
public boolean increasingTriplet(int[] nums) {
if(nums.length < 3) return false;
int first = nums[0];
int second = Integer.MAX_VALUE;
for(int num : nums) {
if(num > second) {
return true;
}else if(num > first) {
second = num;
}else{
first = num;
}
}
return false;
}
}
LeetCode: 350. 两个数组的交集 II
描述:
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
List<Integer> list = new ArrayList<>();
Arrays.sort(nums1);
Arrays.sort(nums2);
int i1 = 0;
int i2 = 0;
while(i1 < nums1.length && i2 < nums2.length) {
if(nums1[i1] == nums2[i2]){
list.add(nums1[i1]);
i1++;
i2++;
}else if(nums1[i1] > nums2[i2]){
i2++;
}else{
i1++;
}
}
int[] res = new int[list.size()];
for(int i = 0; i < list.size(); i++) {
res[i] = list.get(i);
}
return res;
}
}
LeetCode: 395. 至少有 K 个重复字符的最长子串
描述:
给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于 k 。返回这一子串的长度。
class Solution {
public int longestSubstring(String s, int k) {
int[] arr = new int[26];
if(s.length() < k) return 0;
for(char ch : s.toCharArray()) {
arr[ch-'a']++;
}
for(int i = 0; i < s.length(); i++) {
if(arr[s.charAt(i)-'a'] < k) {
int left = longestSubstring(s.substring(0,i),k);
int right = longestSubstring(s.substring(i+1,s.length()),k);
return Math.max(left,right);
}
}
return s.length();
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://wangzhi430.blog.csdn.net/article/details/125757901
内容来源于网络,如有侵权,请联系作者删除!