Leetcode 41. 缺失的第一个正数和Leetcode 155. 最小栈

2024-04-21 14:20

本文主要是介绍Leetcode 41. 缺失的第一个正数和Leetcode 155. 最小栈,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • Leetcode 41. 缺失的第一个正数
    • 题目描述
    • C语言题解和思路
      • 解题思路
  • Leetcode 155. 最小栈
    • 题目描述
    • C语言题解和思路
      • 解题思路


Leetcode 41. 缺失的第一个正数

题目描述

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。

请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

示例 1:

输入:nums = [1,2,0]
输出:3
解释:范围 [1,2] 中的数字都在数组中。

示例 2:

输入:nums = [3,4,-1,1]
输出:2
解释:1 在数组中,但 2 没有。

示例 3:

输入:nums = [7,8,9,11,12]
输出:1
解释:最小的正数 1 没有出现。

提示:

1 <= nums.length <= 10^5
-2 ^31 <= nums[i] <= 2 ^31 - 1

C语言题解和思路

int firstMissingPositive(int* nums, int numsSize) {int *table = (int *)malloc(sizeof(int) * (numsSize + 1));memset(table, 0, sizeof(int) * (numsSize + 1));int i;for(i = 0; i < numsSize; i++){if(nums[i] <= numsSize && nums[i] > 0){table[nums[i]]++;}}for(i = 1; i < numsSize + 1; i++){if(table[i] == 0){return i;}}return numsSize + 1;
}

解题思路

哈希表

建立一个比数组长度大一位的数组 table 作为哈希表,并将它初始化为 0 。

循环遍历数组 nums ,如果该位置的值大于 0 并且不小于数组长度,让哈希表 table 在该值的位置自加。

从下标 1 开始循环遍历哈希表,如果在某个下标哈希表的值为 0 ,直接返回这个下标。

如果循环结束没有返回任何值,则返回数组长度加一。

Leetcode 155. 最小栈

题目描述

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

示例 1:

输入:
[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.

提示:

  • -2 ^31 <= val <= 2 ^31 - 1
  • pop、top 和 getMin 操作总是在 非空栈 上调用
  • push, pop, top, and getMin最多被调用 3 * 10^4 次

C语言题解和思路

typedef struct MinStack{int data[10000];int top;int min[10000];int mintop;
} MinStack;MinStack* minStackCreate() {MinStack *head = (MinStack *)malloc(sizeof(MinStack));head->top = 0;head->mintop = 0;return head;
}void minStackPush(MinStack* obj, int val) {if(obj->mintop == 0 || val <= obj->min[obj->mintop - 1]){obj->min[obj->mintop++] = val;}obj->data[obj->top++] = val;
}void minStackPop(MinStack* obj) {if( obj->min[obj->mintop - 1]  == obj->data[obj->top - 1]){obj->mintop--;}obj->top--;
}int minStackTop(MinStack* obj) {return obj->data[obj->top - 1];
}int minStackGetMin(MinStack* obj) {return obj->min[obj->mintop - 1];
}void minStackFree(MinStack* obj) {free(obj);
}/*** Your MinStack struct will be instantiated and called as such:* MinStack* obj = minStackCreate();* minStackPush(obj, val);* minStackPop(obj);* int param_3 = minStackTop(obj);* int param_4 = minStackGetMin(obj);* minStackFree(obj);
*/

解题思路

定义一个结构体,数组 data 用于存放推进的数据,数组 min 用于存放最小值,变量 top 存放最后进入的数在 data 的下标,变量 mintop 记录最小值在 min 中的下标。

初始化栈时,将 mintop 和 top 初始化为 0 ,返回定义好的指针。

将数据推入栈时:

  • 如果栈中没有最小值或该数小于栈中的最小值时,将该值存入数组 min 中,并更新 mintop 。
  • 将该数据存入数组 data 中,并更新 top 。

将栈顶数据退出栈时:

  • 如果需要推出栈的值等于栈中的最小值,将 mintop 前移一位,将 min 的最小值推出。
  • 将 top 前移一位,将 data 最后进入的值推出。

返回栈顶元素时,根据 top 的值返回数组 data 中的元素。

获取堆栈中的最小元素时,根据 mintop 的值返回数组 miin 中的元素。

这篇关于Leetcode 41. 缺失的第一个正数和Leetcode 155. 最小栈的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/923295

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];

poj 2349 Arctic Network uva 10369(prim or kruscal最小生成树)

题目很麻烦,因为不熟悉最小生成树的算法调试了好久。 感觉网上的题目解释都没说得很清楚,不适合新手。自己写一个。 题意:给你点的坐标,然后两点间可以有两种方式来通信:第一种是卫星通信,第二种是无线电通信。 卫星通信:任何两个有卫星频道的点间都可以直接建立连接,与点间的距离无关; 无线电通信:两个点之间的距离不能超过D,无线电收发器的功率越大,D越大,越昂贵。 计算无线电收发器D

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

hdu 1102 uva 10397(最小生成树prim)

hdu 1102: 题意: 给一个邻接矩阵,给一些村庄间已经修的路,问最小生成树。 解析: 把已经修的路的权值改为0,套个prim()。 注意prim 最外层循坏为n-1。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstri

poj 2175 最小费用最大流TLE

题意: 一条街上有n个大楼,坐标为xi,yi,bi个人在里面工作。 然后防空洞的坐标为pj,qj,可以容纳cj个人。 从大楼i中的人到防空洞j去避难所需的时间为 abs(xi - pi) + (yi - qi) + 1。 现在设计了一个避难计划,指定从大楼i到防空洞j避难的人数 eij。 判断如果按照原计划进行,所有人避难所用的时间总和是不是最小的。 若是,输出“OPETIMAL",若

poj 2135 有流量限制的最小费用最大流

题意: 农场里有n块地,其中约翰的家在1号地,二n号地有个很大的仓库。 农场有M条道路(双向),道路i连接着ai号地和bi号地,长度为ci。 约翰希望按照从家里出发,经过若干块地后到达仓库,然后再返回家中的顺序带朋友参观。 如果要求往返不能经过同一条路两次,求参观路线总长度的最小值。 解析: 如果只考虑去或者回的情况,问题只不过是无向图中两点之间的最短路问题。 但是现在要去要回

poj 3422 有流量限制的最小费用流 反用求最大 + 拆点

题意: 给一个n*n(50 * 50) 的数字迷宫,从左上点开始走,走到右下点。 每次只能往右移一格,或者往下移一格。 每个格子,第一次到达时可以获得格子对应的数字作为奖励,再次到达则没有奖励。 问走k次这个迷宫,最大能获得多少奖励。 解析: 拆点,拿样例来说明: 3 2 1 2 3 0 2 1 1 4 2 3*3的数字迷宫,走两次最大能获得多少奖励。 将每个点拆成两个