从小白开始刷算法 分治法篇 leetcode.169

简介: 从小白开始刷算法 分治法篇 leetcode.169

169. 多数元素


给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。


示例 1:

输入:nums = [3,2,3]

输出:3

示例 2:

输入:nums = [2,2,1,1,1,2,2]

输出:2

题目来源:力扣(LeetCode)


分治法思路


能否写出:不能写出,需要思路,需要视频。

时间:50分钟多

介绍:

分治法(Divide and Conquer)是一种算法设计策略,它将一个大问题分解为多个相同或相似的子问题,然后递归地解决每个子问题,最后将子问题的解合并起来得到整体的解。

分治法的一般思路如下:

分解(Divide):将原始问题划分为多个相同或相似的子问题。通常是将问题划分为规模较小的子问题。

解决(Conquer):递归地解决每个子问题。对每个子问题进行相同的分解过程,直到子问题规模足够小可以直接求解。

合并(Combine):将子问题的解合并起来得到原始问题的解。将每个子问题的解合并起来得到整体的解。

分治法常用于解决具有重叠子问题和可合并子问题性质的问题。通过将问题划分为规模较小的子问题,可以降低问题的复杂度并提高算法的效率。


经典的应用例子包括归并排序、快速排序、二分查找等。在这些算法中,分治法的思想被巧妙地应用,使得问题的解决变得更加高效和简洁。


这张是我画的一部分分治逻辑,希望可以帮助理解,实在不知道怎么描述思路

红色线路为下沉路线。

蓝色线路为返回路线

绿色线路是leftMajor,rightMajor对比逻辑 ,在蓝色线路中进入对比也是对比逻辑。

1687251328478.jpg

// 仅是我的思路代码,leetcode上大神更厉害
class Solution {
    public int majorityElement(int[] nums) {
        return majorityElementRecursive(nums,0,nums.length-1);
    }
    public int majorityElementRecursive(int[] nums, int start, int end) {
        if(start==end){
            return nums[start];
        }
        int middle = start+ (end-start)/2;
        //
        int leftMajor = majorityElementRecursive(nums, start, middle);
        int rightMajor = majorityElementRecursive(nums,middle+1,end);
        //如果leftMajor与rightMajor相等,那直接返回其中一个既可
        if (leftMajor == rightMajor) {
            return leftMajor;
        }
        //如果不相等,那要统计leftMajor/rightMajor出现的次数,在start~end之间
        int leftCount = countOccurrences(nums, leftMajor, start, end);
        int rightCount = countOccurrences(nums, rightMajor, start, end);
        //哪边大取哪边,相等就随便一个返回
        return leftCount > rightCount ? leftMajor : rightMajor;
    }
    private int countOccurrences(int[] nums, int target, int start, int end) {
        int count = 0;
        for (int i = start; i <= end; i++) {
            if (nums[i] == target) {
                count++;
            }
        }
        return count;
    }
}

时间复杂度: O(n)

空间复杂度:O(1)

相关文章
|
3月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
49 0
|
10天前
|
供应链 算法
【算法】——快排,分治算法合集
本文主要介绍排序中的快排思想的应用,做到一法通万法的效果
|
6月前
|
算法 开发者 Python
惊呆了!Python算法设计与分析,分治法、贪心、动态规划...这些你都会了吗?不会?那还不快来学!
【7月更文挑战第10天】探索编程巅峰,算法至关重要。Python以其易读性成为学习算法的首选。分治法,如归并排序,将大问题拆解;贪心算法,如找零问题,每步求局部最优;动态规划,如斐波那契数列,利用子问题解。通过示例代码,理解并掌握这些算法,提升编程技能,面对挑战更加从容。动手实践,体验算法的神奇力量吧!
78 8
|
2月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
2月前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
65 2
|
3月前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
37 2
|
5月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
59 6
|
5月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
56 1
|
5月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
73 1
|
5月前
|
算法 搜索推荐
算法设计 (分治法应用实验报告)基于分治法的合并排序、快速排序、最近对问题
这篇文章是关于分治法应用的实验报告,详细介绍了如何利用分治法实现合并排序和快速排序算法,并探讨了使用分治法解决二维平面上的最近对问题的方法,包括伪代码、源代码实现及时间效率分析,并附有运行结果和小结。