摘要:
过程:从右往左,找到第一个A[i] A[i], j > i;交换A[i] 与 A[j];将A[i + 1]之后的元素逆序(这里的i,j都是下标)。代码: 1 class Solution { 2 public: 3 void nextPermutation(vector &num) { 4... 阅读全文
摘要:
普通的归并排序,需要一个额外的数组来保存每次merge的结果;如果要求不使用额外空间,那么每次merge的时候需要做一些处理。思路:合并left[] 和 right[]时,假如right[0]应该放入left[3],那么:①可以用一个var来保存right[0],然后将left[3]之后的元素右移一... 阅读全文
摘要:
题目:给出一个链表中的两个指针p1和p2,将其之间的结点翻转。思路:可以通过交换结点内的值来实现结点的翻转,空间为O(N);如果要求不能交换值,那么仅凭p1和p2是无法翻转的,因为不知道p1之前的节点,会掉链,只能翻转p1之后的链表,这个过程就类似于给定一个头节点,翻转之后的链表了;可以使用头插法。... 阅读全文
摘要:
剑指offer中有这道题,何海涛博客:数组中出现次数超过一半的数字题目:给定一个数组,数组中有一个数字出现的次数超过数组长度的一半,找出这个数字。思路:先排序,再遍历,统计次数,时间O(N * lgN)。哈希表:统计每个元素次数,当数据分散时消耗空间大。快排的Partition,判断pviot是不是... 阅读全文
摘要:
二叉树的创建。这里采用最简单的情况,创建完全二叉树,用数组来保存: 1 struct TreeNode 2 { 3 int val; 4 TreeNode *left, *right; 5 TreeNode(int x): val(x), left(NULL), right(... 阅读全文