LeetCode 刷题指南以及常见算法题解题思路总结

毕业于北京交通大学,硕士研究生,8年一线软件开发经验,2年项目架构经验。曾就职于朗讯中国,Polycom 通讯技术(中国)研发中心,凡普金科金融科技集团技术经理。参与主导多个重大项目,包括即时通信软件,云视频管理平台,微服务基础架构搭建,互联网金融借贷,移动支付,贷后管理等项目。

文章正文

Leetcode 收集了大量的算法题目,如何有效的进行算法复习从而在面试中脱颖而出,笔者就自己的经历,简单总结如下,希望可以对算法爱好者或者准备面试对朋友提供一些经验。

Leetcode 复习方式

Leetcode 题目特别多,主要根据以下几个纬度进行题目的筛选,提高面试题目的命中率,毕竟面试过程中主要考察的是常见算法题,一般都是一些经典的题目。

  • 先选择 Easy 和 Medium 级别 enter image description here

  • 选择难度后,选择 TOP 的问题,这两个 top 的问题分类,有很多重复的题目,不用担心太多。 enter image description here

  • 在进行完第一步和第二步的题目学习后,进行第二次复习的时候可以按照 Tags 进行,tags 主要是对算法题目进行了解法分类,包括链表类,动态规划类,二叉树类等问题进行分类复习。 enter image description here

  • 利用收藏夹功能。如果有不容易掌握的题目,可以加入收藏夹,方便以后重点复习。 enter image description here

  • 目标公司学习。如果愿意付费,可以购买目标公司的题目。我没有付费查看过,所以不知道命中率怎么样,应该都是网友在 leetcode 上反馈的题目。 enter image description here

整型数组类解题思路

异或操作

代表题目:寻找唯一的单个数 链接:https://leetcode.com/problems/single-number/ 解题方法:异或的运算方法是一个二进制运算: 1^1=0 0^0=0 1^0=1 0^1=1

两者相等为 0,不等为 1。 (1) a ^ b = b ^ a; (2) (a ^ b) ^ c = a ^ (b ^ c); (3) a ^ a = 0, a ^ 0 = a;

正确代码:

    class Solution {
    public int singleNumber(int[] nums) {
       int result=0;
        for(int i=0;i<nums.length;i++){
            result^=nums[i];
        }
        return result;
    }
    }

两个指针

代表题目:Container With Most Water 链接:https://leetcode.com/problems/container-with-most-water/ 解题方法: 两个指针,其实就是面积问题,max=Math.max(max,Math.min(nums[p],nums[q])(q-p)),需要注意的是指针移动不是直接 p++,q--。而是谁小移动谁,这样才能保证找到最大的。

正确代码:

    class Solution {
    public int maxArea(int[] height) {
       int p=0;
       int q=height.length-1;
        int maxArea=0;
       while(p<q){
           maxArea=Math.max(maxArea,Math.min(height[p],height[q])*(q-p));
           if(height[p]<height[q]){
               p++; 
           }
          else{
              q--; 
          }

       }

       return maxArea;

    }
}

利用 HashMap

代表题目*:Two Sum 链接:https://leetcode.com/problems/two-sum/ 解题方法: 两次 for 循环不可以,因为如果有重复元素,map 会覆盖,所以就是一次 for 循环,放入元素和位置,下面继续判断 left 是否存在,如果存在就返回两个索引,这样即时第二个和第一个元素相同,也不会覆盖。

正确代码:

    class Solution {
    public int[] twoSum(int[] nums, int target) {
        int rel[] = new int[2];
        Map<Integer, Integer> map = new HashMap<>();
        for(int i=0;i<nums.length;i++){
            int left=target-nums[i];
            if(map.containsKey(left)){
                rel[0]=i;
                rel[1]=map.get(left);
                retu
                        
作者正在撰写中...
隐藏内容 支付可见
¥9.99 购买
× 订阅 Java 精选频道
¥ 元/月
订阅即可免费阅读所有精选内容