力扣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--;
        }

    }
}
相关推荐
aqiu11111126 分钟前
【C++算法打怪专栏】8. 字符串转换整数 (atoi)
开发语言·c++·算法
信奥卷王9 小时前
[GESP202609 六级] 分树规划
算法
夏幻灵9 小时前
LeetCode 21:合并两个有序链表——双指针与哑节点详解
算法·leetcode·链表
徐小黑ACG10 小时前
Golang 基础05 结构体struct
开发语言·算法·golang
码完就睡11 小时前
数据结构——红黑树
数据结构
码爸11 小时前
数据结构详细介绍
数据结构
Navigator_Z11 小时前
LeetCode //C - 1286. Iterator for Combination
c语言·算法·leetcode
北极有牛11 小时前
cpp学习笔记--常量指针
java·开发语言·算法
GPU实战笔记11 小时前
云端 GPU 训练的账户余额提醒:它能说明什么,不能说明什么?
深度学习·算法·成本管理·gpu云计算·云端训练