栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

多数元素,自除数(力扣oj题)c语言解法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

多数元素,自除数(力扣oj题)c语言解法

题目


链接点这里

思路 哈希表法

这也是我一开始用的方法,通过哈希表和一个记录次数的数组来完成(由于c语言没有哈希表,我只能通过数组来模拟,就导致了负数存不进去,所以我就将数向后移了500,就避免了负数的存在),但是时间复杂度和空间复杂度都太大了。

int arr[100000]={0};//哈希表 
int brr[100000]={0};//记录次数 
#define aa 500//向前移动多少位 
int majorityElement(int* nums, int numsSize){
     int i;
     int max=0;
     for(i=0;i 
摩尔投票法 

这也是我从大神处学来的方法,
仔细看题目,我们发现多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
所以就像打仗一样,多数元素中的各位与其他数的各位相持,留到最后的肯定是多数元素中的一位

代码的实现:

int majorityElement(int* nums, int numsSize){
     int k=0;
     int a=nums[0];//先假设多数元素为第一个元素
     int c=1; //a出现的次数
     for(k=1;k 
自除数 
题目 

限制条件: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。

思路

有了限制条件,我们就不能使用简单的暴力解法,一个个乘,而是要寻找一个时间复杂度低的算法

方法:左右累乘法

直观图:

第一个循环先算左边的
第二个循环再乘上右边的
从而将时间复杂度降低到了o(n)
思路清晰,让我们来写代码

代码:
int* productExceptSelf(int* nums, int numsSize, int* returnSize){
    int* output=(int*)malloc(sizeof(int)*numsSize);
       int left=1;
       int right=1;
       int j=0;
       int i;
       for(i=0;i0)
         left=left*nums[i-1];
         output[i]=left;
       }
       for(i=numsSize-1;i>=0;i--)//先乘左边的
       {
         if(i
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/714109.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号