pivot

Find Minimum in Rotated Sorted Array 典型二分查找

人走茶凉 提交于 2020-08-14 12:51:24
https://oj.leetcode.com/problems/find-minimum-in-rotated-sorted-array/ Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2 ). Find the minimum element. You may assume no duplicate exists in the array. 解题思路: 最朴素的O(n)的方法,就是找到突然变小的那个元素,肯定是最小的。否则就说明所有元素一直变大,本来就是排序的,则返回第一个元素。 public class Solution { public int findMin( int [] num) { if (num.length == 0 ){ return 0 ; } int min = num[0 ]; for ( int i = 0; i < num.length; i++ ){ if (num[i] < min){ return num[i]; } } return min; } } 不过本题还有一个二分查找的方法,可以将时间复杂度降为O(lgN)。代码如下。 public

阅读圣经丨关于DAX

不想你离开。 提交于 2020-08-13 12:20:18
“基础不牢,地动山摇”。 最近,有很多小伙伴和白茶在聊天,也会涉及到一些度量值的编写,经常能遇到说大脑当机的情况。比如说明明自己知道如何去写,但是大脑思维却停止运转,想不起来的情况,话到嘴边却说不出,这种感觉太难受了。 白茶仔细思考了一下原因,还是基础不牢的原因,决定静下心来,从头不定期的梳理圣经。 · 正 · 文 · 来 · 啦 · 白茶是一个萌新,大概在19年7月份开始接触数据这类的概念,并不是一开始就学习PowerBI的。那么PowerBI到底是一个什么样的软件呢?能给我们带来什么呢? 微软官方对于PowerBI的定义是可视化图表,商业智能,但是很多时候这句话不太好理解,怎么个智能?怎么个可视化?什么样的图表?这些都是我们需要仔细了解的。 PowerBI的前身是EXCEL表格,为什么这么说呢?最开始,在数据没有像现在这样庞大的时候,用的最普遍的就是EXCEL表格,里面有一些基础的运算函数,比如SUM,MIN,MAX,MIN函数等等。后来随着数据的发展,EXCEL在处理大数据显得有些力不从心了,微软在之后推出了Power Query。它的主要使用语言是M函数。 同时,微软还添加了一个功能,透视表功能,也叫Power Pivot,被称为20年来微软最伟大的发明。同时,还有另外的两个兄弟,Power View以及Power Map。PV指的是可视化,PM指的是数据地图。

20200614-解线性方程组与状态空间表达式实现的方法

℡╲_俬逩灬. 提交于 2020-08-13 06:48:02
进度日志 公共课一:政治 公共课二:英语一 业务课一:数学一 业务课二:自动控制原理、信号与系统 20200614 很好,上午休息。嗯...调子不对。 下午...重新在状态空间中挣扎...(因为看的是第二次视频了...)能控标准I型和能观标准I型分别来自两种不同的实现方法。后面在进行状态向量的线性变换之时发现特征值特征向量、相似矩阵、对角矩阵需要复习。 晚上,就着笔记复习线性代数解方程组,向量空间与矩阵的秩与方程组的解。 15号...上午计划整高数的微分方程;下午经典控制中的劳斯判据刷题;晚上...无穷级数试试第三遍刷能记起来多少。 公共课一 NONE 公共课二 单词 马桶刷 toilet brush 洗漱用品 toiletries tan 晒黑;棕褐色 lilac 丁香花;淡紫色 起步价 base fare 全价票 full fare ticket fare 饮食、饭菜;出租车乘客 assure 和 ensure区别 assure主语只能是人 业务课一 线性代数-笔记复习 L2 E Elementary/Elimination Matrix P Permutation Matrix I Identity Matrix Good Matrix -> Invertible 通过观察来求简单矩阵的逆 L3 4种方法来看待矩阵乘法AB 注意其中A的列去乘以B的行 -> 秩一矩阵的引出

快速排序算法图文详解(模版使用)

若如初见. 提交于 2020-08-12 16:14:03
算法介绍 快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 算法描述 快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下: 步骤1 :从数列中挑出一个元素,称为 “基准”(pivot ); 步骤2 :重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作; 步骤3 :递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。 算法实现 public void quickSort(int[] num, int left, int right) { //如果left等于right,即数组只有一个元素,直接返回 if(left>=right) { return; } //设置最左边的元素为基准值 int key=num[left]; //数组中比key小的放在左边,比key大的放在右边,key值下标为i int i=left; int j=right; while

Leetcode 215 经典问题数组中第K个最大元素

时光总嘲笑我的痴心妄想 提交于 2020-08-12 15:28:18
前k个最大元素,用堆来做,时间复杂度是O(Nlogk) 第k个最大元素,用快排思想,分治来做,时间复杂度是O(N) 建议背下以下对称的partion操作模板,以第一个数为pivot,一般面试中不用考虑随机优化。 class Solution { public: int findKthLargest(vector<int>& nums, int k) { int n = nums.size(); srand(time(NULL)); helper(nums,0,n-1,k); return nums[n-k]; } void helper(vector<int>& nums, int start, int end, int k){ if(start>=end) return; // 一般选择第一个元素作为pivot,使用随机交换的方法优化 int index = rand()%(end-start+1)+start; swap(nums[start],nums[index]); int key = nums[start], left = start, right = end; while(left<right){ while(left<right&&nums[right]>=key) right--; swap(nums[left],nums[right]); while(left

5.排序(下)

随声附和 提交于 2020-08-12 11:07:43
点击使用幕布查看(含思维导图) 归并排序 特点 非原地,空间复杂度O(n) 稳定 O(nlogn) 归并排序的思想是如果要排序一个数组,我们先把数组从中间分为前后两部分,然后对前后部分分别排序,再将排好序的两部分合在一起,这样整个数组就都有序了 快速排序 特点 原地 不稳定 O(nlongn) 选择一个分区点pivot,把它放到正确的地方,这样数组被分为两部分,然后前后两部分继续此过程 桶排序 核心思想:将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序,最后把每个桶里的数据按顺序取出,组成的序列就是有序的了 时间复杂度:O(n) 如果要排序的数据有 n 个,我们把它们均匀地划分到 m 个桶内,每个桶里就有 k=n/m 个元素 每个桶内部使用快速排序,时间复杂度为 O(k * logk)。m 个桶排序的时间复杂度就是 O(m * k * logk) 因为 k=n/m,所以整个桶排序的时间复杂度就是 O(n*log(n/m)) 当桶的个数 m 接近数据个数 n 时,log(n/m) 就是一个非常小的常量,这个时候桶排序的时间复杂度接近 O(n) 桶排序比较适合用在外部排序中,数据存储在外部磁盘中,数据量比较大,内存有限,无法将数据全部加载到内存中 桶排序对数据的要求 数据容易被划分为m个桶,并且桶与桶直接有着天然的顺序 数据在各个桶之间分布比较均匀,在极端情况下

Redis从入门到精通:中级篇

喜你入骨 提交于 2020-08-12 05:12:01
原文链接:http://www.cnblogs.com/xrq730/p/8944539.html,转载请注明出处,谢谢 本文目录 上一篇文章以认识Redis为主,写了Redis系列的第一篇,现在开启第二部分的学习,在本文中,我们将看到以下内容: Redis数据结构String、Hash、List、Set、SortedSet及相关操作,提一下Redis在3.2.0之后有新增了一种GEO的数据类型表示地理位置,不过本文这种数据结构略过 Redis其他一些常用命令,分为Key操作与服务器操作 Redis事务机制 主要以实战为主,希望通过本文可以让大家掌握Redis的基本使用。 本来这篇文章还准备加上Redis线程模型分析的,但是写完发现篇幅实在太长,就把Redis线程模型放到最后一篇中了,也挺好的,本文专注于对Redis命令的讲解。 另外说一下,本文讲Redis中的数据结构,但是 数据结构本身不在本文的讲解范围内 ,如果想知道Hash、List、Set等数据结构特点及使用场景,可以自己查阅数据结构相关资料。 String数据结构的基本操作 首先说一下数据结构String,这是Redis中最简单的一种数据结构,和MemCache数据结构是一样的,即Key-Value型的数据,根据Redis官方文档, Value最大值为512M 。 下面用表格来看一下String操作的相关命令: 命令

几种基础的数学算法(二)- 排序

喜欢而已 提交于 2020-08-11 23:21:31
几种基础的数学算法(二)- 排序 说起排序算法,估计所有小伙伴参加面试都或多或少接触过。我们先来了解几个概念。 时间复杂度:算法完成排序的总的操作次数; 空间复杂度:算法在运行时所需存储空间大小; 稳定的算法:一个序列中,如果 a 原本在 b 前面,且 a = b,排序之后在新的有序序列中 a 仍然在 b 的前面。 不稳定的算法:一个序列中,如果 a 原本在b的前面,且 a = b,排序之后在新的有序序列中 a 可能会出现在 b 的后面。 排序算法对比 排序算法的文章很多,这里给大家推荐个链接: "如果天空不死"的博客 简单介绍五种排序方法 冒泡排序 无序序列 R<sub>n</sub> 中排序一趟只确认一个排序位置,最多经过 n 趟排序。 冒泡排序在一趟中每次比较两个相邻的元素,如果不符合排序要求,则交换两个元素,直到一趟排序结束。 def swap(arr: list, i: int, j: int): tmp = arr[i] arr[i] = arr[j] arr[j] = tmp # 冒泡排序 # 递增排序 def bubble_inc(arr: list): print("source array = " + str(arr)) arr_len = len(arr) if arr_len == 0: return for i in range(0, arr_len):

分治算法之快排和归并

随声附和 提交于 2020-08-11 20:30:14
分治算法思想将大问题分为小问题,从而解决小问题,最后将结果合并。分治算法一般有三个过程: 分,治,合 。分对应分拆大问题,治解决小问题,合将小问题答案合并起来得出最后答案。典型的分治策略有二分,快排和归并排序。每种算法侧重点不一样,快排侧重于 分 ,没有明显的 合 ,而归并侧重于 治 和 合 , 分 很简单。 快速排序模板: public void qucikSort(int[] array, int left, int right) { if (left >= right) return; int pivot = partition(array, left, right); //分,分的过程中已经治了 qucikSort(array, left, pivot - 1); qucikSort(array, pivot+1, right); } 归并排序模板: public void mergeSort(int[] array, int left, int right) { if (left >= right) return; int middle = (left + right) / 2; mergeSort(array, left, middle);//分 mergeSort(array, middle + 1, right);//分 merge(array, left,

TopK问题,数组中第K大(小)个元素问题总结

旧街凉风 提交于 2020-08-11 07:37:40
问题描述:   在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 面试中常考的问题之一,同时这道题由于解法众多,也是考察时间复杂度计算的一个不错的问题。 1,选择排序   利用选择排序,将数组中最大的元素放置在数组的最前端,然后第k次选择的最大元素就是第K大个元素,直接根据索引返回结果即可。 public class Select { public static void main(String[] args) { int [] arr = new int []{5,3,2,1,4,7,8,10,6,9 }; System.out.println(findKthLargest(arr, 3 )); } private static int findKthLargest( int [] arr, int k){ if (k <= 0 || k > arr.length) throw new IllegalArgumentException("k error" ); for ( int i = 0; i < k; ++ i){ int maxNum = Integer.MIN_VALUE; int maxIndex = -1 ; for ( int j = i; j < arr.length; ++ j){