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--;
        }
    }
}
相关推荐
POLITE34 分钟前
Leetcode 234.回文链表 JavaScript (Day 9)
javascript·leetcode·链表
程序员小假27 分钟前
我们来说一下 MySQL 的慢查询日志
java·后端
独自破碎E1 小时前
Java是怎么实现跨平台的?
java·开发语言
To Be Clean Coder1 小时前
【Spring源码】从源码倒看Spring用法(二)
java·后端·spring
ullio1 小时前
div1+2. 2178F - Conquer or of Forest
算法
xdpcxq10291 小时前
风控场景下超高并发频次计算服务
java·服务器·网络
Leweslyh1 小时前
制导算法开发实践指南:从入门到精通
算法·开发·武器·制导律设计
想用offer打牌1 小时前
你真的懂Thread.currentThread().interrupt()吗?
java·后端·架构
chushiyunen1 小时前
快慢双指针算法笔记
数据结构·笔记·算法
橘色的狸花猫1 小时前
简历与岗位要求相似度分析系统
java·nlp