Leetcode 刷题记录 21 —— 技巧

Leetcode 刷题记录 21 ------ 技巧

本系列为笔者的 Leetcode 刷题记录,顺序为 Hot 100 题官方顺序,根据标签命名,记录笔者总结的做题思路,附部分代码解释和疑问解答,01~07为C++语言,08及以后为Java语言,一共为 01~21,本系列全部结束。

01 只出现一次的数字

java 复制代码
class Solution {
    public int singleNumber(int[] nums) {
        int result = 0;
        for(int num : nums){
            result ^= num;
        }
        return result;
    }
}

位运算

02 多数元素

java 复制代码
class Solution {
    public int majorityElement(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        int n = nums.length;
        int ans = 0;

        for(int num : nums){
            if(!map.containsKey(num)){
                map.put(num, 1);
            }else{
                map.put(num, map.get(num) + 1);
            }
        }

        for(int num : nums){
            if(map.get(num) > (n/2)){
                ans = num;
                break;
            }
        }
        return ans;
    }
}

03 颜色分类

java 复制代码
class Solution {
    public void sortColors(int[] nums) {
        int n = nums.length;
        int ptr = 0;

        //第一次遍历,将0交换到头部
        for(int i=0; i<n; i++){
            if(nums[i] == 0){
                int temp = nums[ptr];
                nums[ptr] = nums[i];
                nums[i] = temp; 
                ptr++;
            }
        }

        //第二次遍历,将1交换到0之后
        for(int i=ptr; i<n; i++){
            if(nums[i] == 1){
                int temp = nums[ptr];
                nums[ptr] = nums[i];
                nums[i] = temp; 
                ptr++;
            }
        }
    }
}

04 下一个排列

java 复制代码
class Solution {
    public void nextPermutation(int[] nums) {
        int len = nums.length;

        //特殊情况判断
        if(nums == null || nums.length < 2){
            return;
        }

        int i = len -2, j = len - 1, k = len - 1;
        while(i >= 0 && nums[i] >= nums[j]){
            i--;
            j--;
        }

        if(i >= 0){
            while(nums[i] >= nums[k]){
                k--;
            }

            int temp = nums[i];
            nums[i] = nums[k];
            nums[k] = temp;
        }

        int left = j, right = len - 1;
        while(left < right){
            int temp = nums[left];
            nums[left] = nums[right];
            nums[right] = temp;
            left++;
            right--;
        }
    }
}
相关推荐
永远都不秃头的程序员(互关)3 分钟前
【决策树深度探索(一)】从零搭建:机器学习的“智慧之树”——决策树分类算法!
算法·决策树·机器学习
Jaxson Lin5 分钟前
Java编程进阶:线程基础与实现方式全解析
java·开发语言
夜喵YM5 分钟前
基于 Spire.XLS.Free for Java 实现无水印 Excel 转 PDF
java·pdf·excel
茶本无香9 分钟前
设计模式之五—门面模式:简化复杂系统的统一接口
java·设计模式
她说可以呀10 分钟前
网络基础初识
java·网络·java-ee
程序员-King.11 分钟前
day161—动态规划—最长递增子序列(LeetCode-300)
算法·leetcode·深度优先·动态规划·递归
没有bug.的程序员12 分钟前
Java锁优化:从synchronized到CAS的演进与实战选择
java·开发语言·多线程·并发·cas·synchronized·
西柚小萌新20 分钟前
【计算机视觉CV:目标检测】--3.算法原理(SPPNet、Fast R-CNN、Faster R-CNN)
算法·目标检测·计算机视觉
高频交易dragon22 分钟前
Hawkes LOB Market从论文到生产
人工智能·算法·金融
麦兜*24 分钟前
SpringBoot Profile多环境配置详解,一套配置应对所有场景
java·数据库·spring boot