力扣hot100做题整理91-100

1.只出现一次的数字

异或"相同为0,不同为1

java 复制代码
class Solution {
    public int singleNumber(int[] nums) {
        // 两个相同,异或后为0
        int res = 0;
        for (int i = 0; i < nums.length; i++) {
            res  = res ^ nums[i];
        }
        return res;
    }
}

2.多数元素

采用摩尔投票的方式

或者采用hash表

java 复制代码
class Solution {
    public int majorityElement(int[] nums) {
        // 摩尔投票
        int res = 0;
        int count = 0;
        for (int num : nums) {
            if (count == 0) {
                res = num;
            }
            if (num == res) {
                count++;
            } else {
                count--;
            }
        }
        return res;
    }
}

3.颜色分类

遍历两边数组,统计

java 复制代码
class Solution {
    public void sortColors(int[] nums) {
        int[] count = new int[3];
        for (int num : nums) {
            count[num]++;
        }
        int index = 0;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < count[i]; j++) {
                nums[index++] = i;
            }
        }

    }
}

4.寻找重复数

直接排序找

java 复制代码
class Solution {
    public int findDuplicate(int[] nums) {
       Arrays.sort(nums);
       for (int i = 0; i < nums.length-1; i++) {
            if(nums[i] == nums[i+1]) {
                return nums[i];
            }
       }
       return 0;
    }
}

5.下一个排列

1.从后往前遍历,第一个递减的排序,记录左边元素a

2.从后往前遍历,找到第一个大于记录的左边元素为b

3.交换a和b

4.a右边的元素全部逆序

java 复制代码
class Solution {
    public void nextPermutation(int[] nums) {
        // 1.从后往前找出第一个升序对(i,j) nums[i] < nums[j] 123465  a[i] = 4 a[j] = 6
        int a = -1;
        for (int i = nums.length-1; i > 0; i--) {
            if (nums[i-1] < nums[i]) {
                a = i-1;
                break;
            }
        }
        if (a == -1) {
            int left = 0, right = nums.length-1;
            while (left <= right) {
                int temp = nums[left];
                nums[left] = nums[right];
                nums[right] = temp;
                left++;
                right--;
            }
            return;
        }
        // 2.从后往前找第一个比a[i]大的元素,并交换位置
        for (int i = nums.length-1; i >= 0; i--) {
            if (nums[i] > nums[a]) {
               int temp = nums[i];
               nums[i] = nums[a];
               nums[a] = temp;
               break;
            }
        }

        // 3.a[j]及后面的元素逆序
        int left = a+1, right = nums.length-1;
        while (left <= right) {
            int temp = nums[left];
            nums[left] = nums[right];
            nums[right] = temp;
            left++;
            right--;
        }

    }
}
相关推荐
小雨下雨的雨4 小时前
井字棋AI机器人实现详解 - Minimax算法实战-鸿蒙PC Electron框架完成
前端·人工智能·算法·华为·electron·鸿蒙
xieliyu.6 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
一条小锦吕*7 小时前
基于Spring Boot + 数据可视化 + 协同过滤算法的推荐系统设计与实现(源码+论文+部署全讲解)
spring boot·算法·信息可视化
cfm_29148 小时前
Redis五大基本数据结构底层了解
数据结构·数据库·redis
如竟没有火炬8 小时前
最大矩阵——单调栈
数据结构·python·线性代数·算法·leetcode·矩阵
8Qi89 小时前
LeetCode 1143 & 718:最长公共子序列 / 最长重复子数组
算法·leetcode·职场和发展·动态规划
绿算技术9 小时前
万卡推理集群存储选型分析:从核心架构到应用视角
大数据·科技·算法·架构
想吃火锅100510 小时前
【leetcode】1.两数之和js版
javascript·算法·leetcode
net3m3311 小时前
一阶软件低通滤波器算法
人工智能·算法