题目:我们把只包含因子2,3,5的数叫做丑数.寻找第1500个丑数.通常把1当成第一个丑数. 思路1:第一步判断是否为丑数:丑数是只包含2,3,5的数,因此一定可以被2,3,5整除.通过求余数是否为零做为判断条件,通过除以来减小整个数的值,知道整个数为1.返回true. 第二步找到第N个丑数的值,这一种做法的缺点是,不是丑数的数也要求余数除数的运算,因此耗时.因此我们提出一种以空间换时间的方法(谁让如今硬件更新的快呢).如2思路. 思路2:我采用一个数组按照从小到大的顺序存放丑数.数组中最后一个…
题目:输入一个整数n,从1到n这n个十进制整数中1出现的次数. 思路1:对1到n中的任意一个数i对其进行求余数来判断个位是否为1,然后再求除数,判断十位是否为1.统计出1的个数.然后对1到n用一个循环将所有的数都加起来.时间复杂度为O(nlogn). 思路2:根据数字的规律来求.例如:21344这个数,我们将它分成两部分,第一部分为1345~21344.这部分我们可以先求出最高位上一出现的次数.又分为两种情况,10000~19999这种情况下最高位大于1,1出现的次数为10^4,另一种是1000…
题目:在数组中如果两个数字的前面的数比后面的数大,则称为一对逆序对.输入一个数组求出数组中逆序对的总数. 以空间换时间:思路:借助一个辅助数组,将原来的数组复制到该数组中.然后将该数组分成子数组,然后统计子数组中内部的逆序,然后再统计两个相连的子数组中的逆序对,这个过程用到了归并排序.时间复杂度为O(nlogn). 如下图所示: Java代码: public class ReversePairs { public int reversePairs(int[] a){ if(a==null) re…
题目:输入一个数组,找出一个数字,它在数组中出现的次数超过数组的一半. 题目规定如果可以改变数组中元素的位置. 思路1:如果数组是排序的,那么中间元素的位置不就是次数超过数组一半的元素吗?是的,因此我们可以才用partition来做判断.如果partition的得到的整数index是在数组的中间,那么该元素就是超过数组中一半次数的元素.时间效率为O(n). 题目规定不可以改变元素的位置 思路2:此时,我们不能对数据进行排序,因此,我们可以考虑到数组中出现次数超过一半的元素比其他所有的元素都出现的…
题目:输入一个正整数数组,将所有的数,排列起来,组成一个最小的数.…
思路1:要求的是两个链表的第一个公共节点,首先想到的是用栈来存放两个链表,然后依次从栈中抛出,直到最后一个相同的节点为止.但是要用到两个栈,空间复杂度为O(n): 思路2:从头到尾分别遍历两个链表得到链表的长度风别为,len1和len2,求出两者的差值dif,然后现在长的链表上面走dif步,然后同步走剩下的节点,当就可以找到第一个公共节点了. public ListNode findFirstCommonNode(ListNode pHead1,ListNode pHead2){ if(pHea…
题目:在字符串中第一次出现切只出现一次的字符 思路:用HashMap来存放对应的char值和该char出现的次数.做一次变量就可以得到第一个只出现一次的字符. Java代码: import java.util.LinkedHashMap; //思路:用HashMap来存放对应的char值和该char出现的次数.做一次变量就可以得到第一个只出现一次的字符. public class FirstNotRepeatingChar { public Character firstNotRepeating…
题目:输入一个数组,数组中有正也有负,数组中连续的一个或者连续的多个数字组成一个子数组.求所有的子数组和的最大值.要求时间复杂度为O(n) 思路:我们的最直观的想法就是求出这个数组中的所有的子数组,然后比较他们的和的大小,如果输入的数组元素个数为N,那么就要有N(N+1)/2个子数组.很明显是不符合要求的.然后我可以用动态规划的思想.假设sum(i)以第i个元素结尾的连续的最大的子数组和.假设i前面的子数组之和都已经求出.那么sum(i)要么就是sum(i-1)和a[i]的和,要么就是a[i]本…
题目:输入n个数,输出最小的k个数. 时间复杂度为O(n) 思路1:我们想的到的最直接的思路就是对这个N个数进行排序,然后就可以找到最小的k个了,同样可以用快排partition.但是只要找到前K个最小的元素,并不一定要排好序. Java代码: import java.util.Random; //时间复杂度为O(n): public class PreKOfArray { //一趟快速排序 public int partition(int[] a,int start,int end){ if(…
剑指offer第五章 1.数组中出现次数超过一半的数 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. 分析: 思路1:数组排序,排序之后中间的数字一定是出现次数超过数组长度一半的数字,也就是统计学上的中位数,即长度为n的数组中第n/2大的数字(数组中任意第k大的数字) class Solution { public: int Mor…