数据流的中位数


class MedianFinder {
private Queue<Integer> maxHeap = new PriorityQueue(new Comparator<Integer>(){
@Override
public int compare(Integer i1, Integer i2){
return Integer.compare(i2, i1);
}
});
private Queue<Integer> minHeap = new PriorityQueue(new Comparator<Integer>(){
@Override
public int compare(Integer i1, Integer i2){
return Integer.compare(i1, i2);
}
}); // Adds a number into the data structure.
public void addNum(int num) {
minHeap.offer(num);
maxHeap.offer(minHeap.poll()); //if(maxHeap.size() > minHeap.size())
if(maxHeap.size() - minHeap.size() == 1){
minHeap.offer(maxHeap.poll());
}
} // Returns the median of current data stream
public double findMedian() {
return minHeap.size() > maxHeap.size()
? (double)minHeap.peek()
: (minHeap.peek() + maxHeap.peek())/2.0;
}
};

两个已排序数组的中位数


public class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.length;
int n = nums2.length;
int mid1 = (m+n+1)/2;
int mid2 = (m+n+2)/2;
return (findKthNum(nums1,0,nums2,0,mid1) + findKthNum(nums1,0,nums2,0,mid2))/2.0;
}
public int findKthNum(int[] nums1,int start1,int[] nums2,int start2,int k){
if(start1>nums1.length-1){return nums2[start2+k-1];}
if(start2>nums2.length-1){return nums1[start1+k-1];}
if(k==1) return Math.min(nums1[start1],nums2[start2]);
int mid1 = Integer.MAX_VALUE,mid2=Integer.MAX_VALUE;
if(nums1.length-start1+1>k/2){mid1 = nums1[start1+k/2 - 1];}
if(nums2.length-start2+1>k/2){mid2 = nums2[start2+k/2 - 1];}
if(mid1<mid2){
return findKthNum(nums1,start1+k/2,nums2,start2,k-k/2);
}else{
return findKthNum(nums1,start1,nums2,start2+k/2,k-k/2);
}
}
}

旋转数组中找到最小的数字


public class Solution {
public int findMin(int[] nums) {
int len = nums.length;
int l=0;
int r=len-1;
while(l<r){
if(nums[l]<nums[r]){return nums[l];}
int mid = l + (r-l)/2;
if(nums[mid]>nums[r]){
l = mid + 1;
}else if(nums[mid]<nums[r]){
r = mid;
}else{
r--;
}
}
return nums[l];
}
}

旋转数组中搜索一个数字


public class Solution {
public boolean search(int[] nums, int target) {
int start = 0, end = nums.length - 1, mid = -1;
while(start <= end) {
mid = (start + end) / 2;
if (nums[mid] == target) {
return true;
}
//If we know for sure right side is sorted or left side is unsorted
if (nums[mid] < nums[end] || nums[mid] < nums[start]) {
if (target > nums[mid] && target <= nums[end]) {
start = mid + 1;
} else {
end = mid - 1;
}
//If we know for sure left side is sorted or right side is unsorted
} else if (nums[mid] > nums[start] || nums[mid] > nums[end]) {
if (target < nums[mid] && target >= nums[start]) {
end = mid - 1;
} else {
start = mid + 1;
}
//If we get here, that means nums[start] == nums[mid] == nums[end], then shifting out
//any of the two sides won't change the result but can help remove duplicate from
//consideration, here we just use end-- but left++ works too
} else {
end--;
}
} return false;
}
}

归并两个排序链表


public class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null||l2==null) return l1==null?l2:l1;
ListNode head = null;
if(l1.val<=l2.val) {
head=l1;
l1=l1.next;
}
else {
head=l2;
l2=l2.next;
}
ListNode temp = head;
while(l1!=null&&l2!=null){
if(l1.val<=l2.val) {
temp.next=l1;
l1=l1.next;
}
else {
temp.next=l2;
l2=l2.next;
};
temp=temp.next;
}
temp.next=l1==null?l2:l1;
return head;
}
}

归并K个排序链表


public class Solution {
public static ListNode mergeKLists(ListNode[] lists){
return partion(lists,0,lists.length-1);
} public static ListNode partion(ListNode[] lists,int s,int e){
if(s==e) return lists[s];
if(s<e){
int q=(s+e)/2;
ListNode l1=partion(lists,s,q);
ListNode l2=partion(lists,q+1,e);
return merge(l1,l2);
}else
return null;
} //This function is from Merge Two Sorted Lists.
public static ListNode merge(ListNode l1,ListNode l2){
if(l1==null) return l2;
if(l2==null) return l1;
if(l1.val<l2.val){
l1.next=merge(l1.next,l2);
return l1;
}else{
l2.next=merge(l1,l2.next);
return l2;
}
}
}

寻找重复数字,O(N),O(1)

参考:Find the Duplicate Number


public class Solution {
public int findDuplicate(int[] nums) {
int slow = 0;
int fast = 0;
do{
slow = nums[slow];
fast = nums[nums[fast]];
}while(slow!=fast);
int find = 0;
do{
slow = nums[slow];
find = nums[find];
}while(slow!=find);
return find;
}
}

第一个不存在的正数


public class Solution {
public int firstMissingPositive(int[] nums) {
int n= nums.length;
for(int i=0;i<n;){
if(nums[i]>0 && nums[i]<=n && nums[i]!=nums[nums[i]-1]){
swap(nums,i,nums[i]-1);
}else{
i++;
}
}
int j=0;
for(j=0;j<n;j++){
if(j+1 != nums[j]){
return j+1;
}
}
return n+1;
}
public void swap(int[] nums,int i,int j){
int tmp = nums[j];
nums[j] = nums[i];
nums[i] = tmp;
}
}

KMP算法


class Solution {
public:
void getNext(vector<int> &next,string &needle){
int i=0,j=-1;
next[i] = j;
while(i<needle.size()-1){
while(j != -1 && needle[i]!=needle[j]){
j = next[j];
}
i++;
j++;
if(needle[i] == needle[j]) next[i]=next[j];
else next[i] = j;
}
}
int strStr(string haystack, string needle) {
if (haystack.empty()) return needle.empty() ? 0 : -1;
if (needle.empty()) return 0;
vector<int> next(needle.size()+1);
getNext(next,needle);
int i=0,j=0;
while(i != haystack.size()){
while(j!=-1 && haystack[i] != needle[j]){j=next[j];}
i++;
j++;
if(j == needle.size()) return i-j;
}
return -1;
}
};

寻找数列的峰点(比两边数字都大的点)


public class Solution {
public int findPeakElement(int[] num) {
return helper(num,0,num.length-1);
}
public int helper(int[] num,int start,int end){
if(start == end){
return start;
}else if(start+1 == end){
if(num[start] > num[end]) return start;
return end;
}else{
int m = (start+end)/2;
if(num[m] > num[m-1] && num[m] > num[m+1]){
return m;
}else if(num[m-1] > num[m] && num[m] > num[m+1]){
return helper(num,start,m-1);
}else{
return helper(num,m+1,end);
}
}
}
}

LeetCode(一)的更多相关文章

  1. 我为什么要写LeetCode的博客?

    # 增强学习成果 有一个研究成果,在学习中传授他人知识和讨论是最高效的做法,而看书则是最低效的做法(具体研究成果没找到地址).我写LeetCode博客主要目的是增强学习成果.当然,我也想出名,然而不知 ...

  2. LeetCode All in One 题目讲解汇总(持续更新中...)

    终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 477 Total Hamming Distance ...

  3. [LeetCode] Longest Substring with At Least K Repeating Characters 至少有K个重复字符的最长子字符串

    Find the length of the longest substring T of a given string (consists of lowercase letters only) su ...

  4. Leetcode 笔记 113 - Path Sum II

    题目链接:Path Sum II | LeetCode OJ Given a binary tree and a sum, find all root-to-leaf paths where each ...

  5. Leetcode 笔记 112 - Path Sum

    题目链接:Path Sum | LeetCode OJ Given a binary tree and a sum, determine if the tree has a root-to-leaf ...

  6. Leetcode 笔记 110 - Balanced Binary Tree

    题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...

  7. Leetcode 笔记 100 - Same Tree

    题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...

  8. Leetcode 笔记 99 - Recover Binary Search Tree

    题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...

  9. Leetcode 笔记 98 - Validate Binary Search Tree

    题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...

  10. Leetcode 笔记 101 - Symmetric Tree

    题目链接:Symmetric Tree | LeetCode OJ Given a binary tree, check whether it is a mirror of itself (ie, s ...

随机推荐

  1. linux shell mysql 数据库主从同步状态检查告警

    需求: 1.监测数据库主从状态 2.获取数据库主要参数 3.可读取配置文件 4.部署位置自适应.   参考资料: http://blog.csdn.net/yf210yf/article/detail ...

  2. Abstract和Virtual和interface , 派生类中重写 override / new关键字

    http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html C#中Abstract和Virtual 在C#的学习中,容易混淆virtua ...

  3. Apache + PHP 环境搭建

    环境: Win7 64位 php-5.6.19-Win32-VC11-x64 httpd-2.4.18-win64-VC11 下载地址: php:  http://windows.php.net/do ...

  4. 读CopyOnWriteArrayList有感

    除了加锁外,其实还有一种方式可以防止并发修改异常,这就是将读写分离技术(不是数据库上的). 先回顾一下一个常识: 1.JAVA中“=”操作只是将引用和某个对象关联,假如同时有一个线程将引用指向另外一个 ...

  5. xml与json 介绍

    一.JSON数据格式 1)概念:json是一种网络数据传输格式,有值/对象:{“A”:1,”B”:”2”…}词典:对象的序列:[,,,,,]数组两种数据类型 2)URLWithString 将字符串网 ...

  6. Linux进程启动过程简析

    朱宇轲 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 今天,我们将通过 ...

  7. C++中的RTTI机制解析

    RTTI RTTI概念 RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型. RTTI ...

  8. AbstractQueueSynchronizer

    1.AbstractQueuedSynchronizer(以下简称AQS)是Java并发包提供的一个同步基础机制,是并发包中实现Lock和其他同步机制(如:Semaphore.CountDownLat ...

  9. 解决IE9下JQuery的ajax失效的问题

    jquery ajax在跨域访问post请求的时候,ie9以下无效(包括ie9)   1. 设置浏览器安全属性,启用[通过域访问数据源]选项,如图:

  10. nginx 启动,停止和重新加载配置

    要启动nginx的,运行可执行文件.一旦nginx的启动时,它可以通过与-s参数调用可执行来控制.使用以下语法 nginx -s signal 其中,信号可以是下列之一: stop - fast sh ...