小工具知识网

当前位置: 首页 > 行业知识 > 力扣Hot100

行业知识

力扣Hot100

2026-10-30 04:12:43 来源:互联网转载

力扣100题easy

1. 两数之和

���间空间复杂度为O(N),思路是:创建一个哈希表,对于每一个 x,先查询哈希表中是否存在 target - x,然后将 x 插入到哈希表中,即可保证不会让 x 和自己匹配。

()
class Solution {    public int[] twoSum(int[] nums, int target) {        Map hashtable = new HashMap();        for(int i = 0; i  

21. 合并两个有序链表

用递归的思路:判断 l1 和 l2 哪一个链表的头节点的值更小,递归地决定下一个添加到结果里的节点。

class Solution {    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {        if (l1 == null) {            return l2;        } else if (l2 == null) {            return l1;        } else if (l1.val  

160. 相交链表

思路一:哈希集合存放不重复的元素,先将A链表的结点add后,再依次判断B链表的结点是否有相同的。

()
public class Solution {    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {        Set set = new HashSet();        ListNode p = headA, q = headB;        while(p != null){            set.add(p);            p = p.next;        }        while(q != null){            if(set.contains(q)){                return q;            }            q = q.next;        }        return null;       }}

思路二:用双指针,先判断A、B链表是否为空,有空的则根本无法相交。都不为空则要同时更新p和q,p不为空就next,为空则指向headB。q同理,最后指向同一个结点或者null,返回即可。

public class Solution {    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {        if(headA == null || headB == null){            return null;        }        ListNode p = headA, q = headB;        while(p != q){            p = p == null ? headB : p.next;            q = q == null ? headA : q.next;        }        return p;    }}

234. 回文链表

要学的思路是把链表的值复制到数组中,再用双指针进行判断。

class Solution {    public boolean isPalindrome(ListNode head) {        List array = new ArrayList();        ListNode p = head;        while(p != null){            array.add(p.val);            p = p.next;        }        //用双指针判断是否是回文        int front = 0;        int back = array.size() - 1;        while(front  

283. 移动零

思路:分两次遍历,j用来记录当前数组中非0的元素,每遇到一个非0元素就往数组左边挪,遍历完后,j指向的是最后一个非0元素下标。第二次遍历就从j开始到结束,将其置为0。

class Solution {public void moveZeroes(int[] nums) {if(nums == null){            return;        }        int j = 0;        for(int i = 0; i  

101. 对称二叉树

要镜像对称,左右两边是相当的。递归的终止条件:两个结点为空;其中一个结点为空;两个结点不相等。随后再比较left.left, right.right和left.right, right.left

class Solution {    public boolean isSymmetric(TreeNode root) {        if(root == null){            return true;        }        return dfs(root.left, root.right);    }    public boolean dfs(TreeNode left, TreeNode right){        if(left == null && right == null){            return true;        }else if(left == null || right == null){            return false;        }else if(left.val != right.val){            return false;        }        return dfs(left.left, right.right) && dfs(left.right, right.left);    }}

543. 二叉树的直径

思路:求直径等同于求路径经过节点数的最大值 - 1。定义一个递归函数,返回该节点为根的子树的深度。先递归调用左儿子和右儿子求得它们为根的子树的深度 L 和 R,则该节点为根的子树的深度即为max(L, R) + 1。设置一个全局变量ans记录,最后返回ans - 1就是直径。

class Solution {    int ans;    public int diameterOfBinaryTree(TreeNode root) {        ans = 1;        depth(root);        return ans - 1;    }    public int depth(TreeNode node){        if(node == null){            return 0;        }        int L = depth(node.left);        int R = depth(node.right);        //ans是所有节点经过节点数的最大值        ans = Math.max(ans, L + R + 1);        //返回该节点为根的子树的深度        return Math.max(L, R) + 1;    }}

20. 有效的括号

class Solution {    public boolean isValid(String s) {       if(s.isEmpty()){           return true;       }        Stack stack = new Stack();       for(char c : s.toCharArray()){           if(c == '('){               stack.push(')');           }else if(c == '{'){               stack.push('}');           }else if(c=='['){               stack.push(']');           }else if(stack.empty() || c != stack.pop()){               return false;           }       }       if(stack.empty()){            return true;        }        return false;    }}

121. 买卖股票的最佳时机

两层循环超出时间,思路是:要在价格最低的那天买入用min来记录,那第i天的利益就是prices[i] - min,这样只需要一次循环。

class Solution {    public int maxProfit(int[] prices) {        int min = Integer.MAX_VALUE;        int max = 0;        for(int i = 0; i  max){                max = prices[i] - min;            }        }        return max;    }}

70. 爬楼梯

思路:跟斐波拉契数列思路很像,只是初始值不同。f(0) = 1,f(1) = 1,f(2) = 2。状态转移方程是:f(n) = f(n - 1) + f(n - 2)。如果是建立长度为n的dp数列,则空间复杂度是O(n),可以用滚动数组的思想进行状态压缩。

class Solution {    public int climbStairs(int n) {        int sum = 1; //相当于f(n),f(n - 1) + f(n - 2)        int i = 0, j = 0;         for(int k = 0; k  

118. 杨辉三角

思路:两层循环,i表示行数,第一个和最后一个都是1,即j == 0 || j == i。中间的数就是上一行左上角加右上角,即[i - 1][j] + [i - 1][j - 1]。

class Solution {    public List generate(int numRows) {        List ret = new ArrayList();        for(int i = 0; i 

上一篇:陕西怎么没有lol服务器?

下一篇:怎么看自己的主机可以装什么显卡