剑指offer:39-42记录

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

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

示例 1:

输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2

限制:

1 <= 数组长度 <= 50000

思路:

打擂台法:

擂主和打擂者不一样,就减一条命。擂主和打擂者一样,就加一条命。

擂主生命被减为0,就下台,由挑战者上台。

最后在擂台上的人就是答案。

正确性:我们假象:那个传说中出现次数一半以上的数字x和剩下的人对抗,最终结果是,x获胜,生命至少还有1,对吧。

真实情况:不是x的数字不仅会减x的生命值,还会“内耗”,也就是互相减生命,所以无论如何x将是最后的胜利者。

class Solution {public int majorityElement(int[] nums) {int target=nums[0];//擂台上的人int num=1;//擂台上的人的生命for(int i=0;i<nums.length;i++){if(nums[i]!=target){num--;}else{num++;}if(num==0){num=1;target=nums[i];}}return target;}
}

输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。

示例 1:

输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]
示例 2:

输入:arr = [0,1,2,1], k = 1
输出:[0]
 

限制:

0 <= k <= arr.length <= 10000
0 <= arr[i] <= 10000

思路:快排,根据一趟排出的情况只对一边继续即可。

重点::::::::::

            while(i<j && arr[j]>=key)j--;

            arr[i]=arr[j];

            while(i<j && arr[i]<=key)i++;

            arr[j]=arr[i];

不加那个等于号就超时,不知道为啥。

class Solution {public int[] getLeastNumbers(int[] arr, int k) {help(arr,k,0,arr.length-1);return Arrays.copyOf(arr, k);}public void help(int[] arr,int k,int left,int right){if(left>=right || left>=k)return;int key=arr[left];int i=left;int j=right;while(i<j){while(i<j && arr[j]>=key)j--;arr[i]=arr[j];while(i<j && arr[i]<=key)i++;arr[j]=arr[i];}arr[i]=key;if(k <= j) help(arr,k, left, j-1);else help(arr, k, j + 1, right);}
}

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。

例如,

[2,3,4] 的中位数是 3

[2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构:

void addNum(int num) - 从数据流中添加一个整数到数据结构中。
double findMedian() - 返回目前所有元素的中位数。
示例 1:

输入:
["MedianFinder","addNum","addNum","findMedian","addNum","findMedian"]
[[],[1],[2],[],[3],[]]
输出:[null,null,null,1.50000,null,2.00000]
示例 2:

输入:
["MedianFinder","addNum","findMedian","addNum","findMedian"]
[[],[2],[],[3],[]]
输出:[null,null,2.00000,null,2.50000]
 

限制:

最多会对 addNum、findMedia进行 50000 次调用。

思路:维护一个大根堆一个小根堆,分别记录小的一半和大的一半。采用任何策略,可以维护两个堆大小一样即可(我的策略中小的一半可以多一个,也就是说多那个中位数)。

class MedianFinder {private PriorityQueue<Integer> maxHeap, minHeap;public MedianFinder() {maxHeap = new PriorityQueue<>(Collections.reverseOrder());minHeap = new PriorityQueue<>();}public void addNum(int num) {maxHeap.offer(num);minHeap.offer(maxHeap.poll());//调整:maxHeap始终=minHeap或minHeap+1if (minHeap.size() > maxHeap.size()) {maxHeap.offer(minHeap.poll());}}public double findMedian() {if (maxHeap.size() == minHeap.size()) {return (maxHeap.peek() + minHeap.peek()) * 0.5;}return maxHeap.peek();}
}/*** Your MedianFinder object will be instantiated and called as such:* MedianFinder obj = new MedianFinder();* obj.addNum(num);* double param_2 = obj.findMedian();*/

输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

要求时间复杂度为O(n)。

 

示例1:

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
 

提示:

1 <= arr.length <= 10^5
-100 <= arr[i] <= 100

思路:简单dp不解释。

class Solution {public int maxSubArray(int[] nums) {int ans=Integer.MIN_VALUE;int num=0;for(int i:nums){num=num>0?num+i:i;if(num>ans)ans=num;}return ans;}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444123.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

炸窝哈希值的原理

package asdfg; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class aaa { public static void main(String[] args) {/*** 小提示&#xff1a;* 1.对于所有没有索引的方法&#xff0c;我们都不能使用for循环进行遍历* 2.提到接口&am…

剑指offer:45-48记录

输入一个正整数数组&#xff0c;把数组里所有数字拼接起来排成一个数&#xff0c;打印能拼接出的所有数字中最小的一个。 示例 1: 输入: [10,2] 输出: "102" 示例 2: 输入: [3,30,34,5,9] 输出: "3033459" 提示: 0 < nums.length < 100 说明:…

炸窝(可变函数)

可变函数源码理解&#xff1a;学生角度&#xff0c;更易操作 public static void main(String[] args) {/*int cadd(10,29);System.out.println(c);*///此时可以随意的进行数据的传递add(20,30,40);//[I1db9742:解释&#xff0c;中括号代表是一个数组&#xff0c;为一个地址值…

剑指offer:50-53记录

在字符串 s 中找出第一个只出现一次的字符。如果没有&#xff0c;返回一个单空格。 示例: s "abaccdeff" 返回 "b" s "" 返回 " " 限制&#xff1a; 0 < s 的长度 < 50000 思路&#xff1a;map记录次数&#xff0c;再…

Eclipse安装插件的几种方式

前段时间Google转向了IDEA&#xff0c;貌似有些动摇了Eclipse作为Java领域IDE龙头老大的位置&#xff0c;为此引起了Eclipse粉丝和IDEA粉丝的集体骂战。类似这种骂战向来都不绝于耳&#xff0c;貌似程序员的都比较多&#xff0c;可能大家都是搞技术出身&#xff0c;都很自信。其…

炸窝(Collections当中的addAll方法)

public class aaa { public static void main(String[] args) {/** java.util.Collections是集合工具类&#xff0c;用来对集合进行操作&#xff0c;* * 集合Collections当中的两个方法&#xff1a;* 1.addAll方法&#xff1a;因为是静态方法&#xff0c;嗯所以可以.直接吹风机…

剑指offer:55-58记录

输入一棵二叉树的根节点&#xff0c;求该树的深度。从根节点到叶节点依次经过的节点&#xff08;含根、叶节点&#xff09;形成树的一条路径&#xff0c;最长路径的长度为树的深度。 例如&#xff1a; 给定二叉树 [3,9,20,null,null,15,7]&#xff0c; 3 / \ 9 20 …

Map集合知识点(炸窝)

/** * 简单的介绍一下我们接下来准备学习的集合MAP集合 * * Map集合的简单概述&#xff1a; * 其中的健是不能进行重复的&#xff0c;而且每一健只能映射一个值&#xff0c;简单的说就是K与V是一一对应的&#xff0c;不能有其他的关系&#xff0c; * 但是我们注意到value值是可…

剑指offer:63-66记录

假设把某股票的价格按照时间先后顺序存储在数组中&#xff0c;请问买卖该股票一次可能获得的最大利润是多少&#xff1f; 示例 1: 输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天&#xff08;股票价格 1&#xff09;的时候买入&#xff0c;在第 5 天&#xff08;股票价格 6&a…

【大总结3】leetcode解题总览(算法、剑指offer、SQL、多线程、shell)

3/22更新 剑指offer 题目链接 建议大部分题都会做&#xff0c;都能比较快速且准确的写出来。关于做题方式&#xff0c;我的建议是&#xff1a;一道一道刷即可&#xff0c;因为难度一般&#xff0c;不用系统的学习什么知识&#xff0c;遇到实在不会的就跳过即可。 我这里写了…

逆序存储【数据结构】

C语言中malloc是动态内存分配函数。 函数原型&#xff1a;void malloc(unsigned int num_bytes); 参数&#xff1a;num_bytes 是无符号整型&#xff0c;用于表示分配的字节数。 返回值&#xff1a;如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定)&#xff0…

为什么 main 方法是 public static void ?

main 方法是我们学习Java编程语言时知道的第一个方法&#xff0c;你是否曾经想过为什么 main 方法是 public、static、void 的。当然&#xff0c;很多人首先学的是C和C&#xff0c;但是在Java中main方法与前者有些细微的不同&#xff0c;它不会返回任何值&#xff0c;为什么 ma…

返回地址【数据结构】

小问题&#xff1f; 1.我们是如何根据地址值来找到我们对应的数据的&#xff1f; 详细陈述一下&#xff1a;当我们开辟一个整数类型&#xff0c;取名为a&#xff0c;假设地址空间是从数值为2000进行存储&#xff0c;并且我们假设整形占用4个字节&#xff0c;那么我们在内存中需…

【超级详细的小白教程】Hexo 搭建自己的博客

– 前言 这是一篇有关如何使用 Github Pages 和 Hexo 搭建属于自己独立博客的详尽教程&#xff0c;本人是软件工程专业本科生&#xff0c;目前只学习了C和C编程语言&#xff0c;对网站开发的有关知识几乎为零&#xff0c;这也是我搭建好自己的博客之后写的第一篇博客&#xff…

面向对象思想精华总结

一、三大特性 封装继承多态 二、类图 泛化关系 (Generalization)实现关系 (Realization)聚合关系 (Aggregation)组合关系 (Composition)关联关系 (Association)依赖关系 (Dependency) 三、设计原则 S.O.L.I.D其他常见原则 参考资料 一、三大特性 封装 利用抽象数据类型将数据…

数组名与指向数组的指针之间的联系与区别【数据结构】

我们遇到一个非常棘手的问题&#xff0c;这个问题就是&#xff0c;对于一堆数据来说&#xff0c;我们进行存储&#xff0c;放到一个指定的仓库当中&#xff0c;先前我们使用数组加加标的形式进行访问仓库当中的元素位置&#xff0c;但是呢&#xff0c;现在我们使用的是一个指针…

Struts2的action中处理JSONP方式提交的中文乱码问题:

昨天在做公司网站的时候出现了一个中文乱码问题&#xff0c;让我郁闷了一晚上和一上午&#xff0c;最后在网友的提示下&#xff0c;我终于解决了&#xff0c;现在写出来供后来的兄弟们参考&#xff1a; 1.问题是这样的&#xff0c;就是客户端是以JSONP的方式提交的数据&#x…

leetcode509. 斐波那契数(矩阵快速幂)

斐波那契数&#xff0c;通常用 F(n) 表示&#xff0c;形成的序列称为斐波那契数列。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0, F(1) 1 F(N) F(N - 1) F(N - 2), 其中 N > 1. 给定 N&#xff0c;计算 F(N)。…

insert函数的修改,

我们来看一下图片当中的第2个圆圈&#xff0c;为什么使用size来相加呢&#xff1f;我们知道一开始我们定义的初始空间为init_size;我们想一下啊&#xff0c;如果是第1次进行空间的增加&#xff0c;那么我们使用InIt来进行相加是可以的&#xff0c;但是当第2次想加我们再想开辟空…

leetcode520. py解字符串真是太残暴了

给定一个单词&#xff0c;你需要判断单词的大写使用是否正确。 我们定义&#xff0c;在以下情况时&#xff0c;单词的大写用法是正确的&#xff1a; 全部字母都是大写&#xff0c;比如"USA"。 单词中所有字母都不是大写&#xff0c;比如"leetcode"。 如果…