question 1:寻找3个数的最大乘积
给定一个列表,找出3个数使得他们的积最大
答案:
积最大的情况:
(1)有两个最小的负数了一个最大的正数组成
(2)由3个最大的正数组成
方法1:
时间复杂度:O(n*logn)因为排序算法而消耗的时间
方法二:
实际上我们并不需要对整个列表排序,只需要找到最大的3个数和最小的两个数就可以
时间复杂度:O(n)
question2 :寻找3个点,使得3个点之间两两距离相等(点之间有次序)
答案:
因为点的次序是有要求的,所以对于每个点都要循环计算所有点的距离,所以时间复杂度一定时O(n^2)
对于一个点,循环n次计算出所有点距离这个点的距离,建立一个hash表(字典,以距离为key),所以假设距离1中有3个点,那么可能的组合为A(3,2),因为对于n个点都要计算一次,所以目标点的位置就假设在第一位(也就是说3个点中只有2个点的位置是可以选择的)
那么假如同一个距离d有n个点,那么可以的选择有 n*(n-1)个(n>=1)
question 3:翻转链表的指定位置
给定链表和指定的节点序号,翻转指定的节点
我的答案:
这道题的难点在于要想到头结点是会变化的。假如m=1,也就是说head也被翻转了,那么这时候返回head值肯定是错误的(因为这时候head不是头结点了)
解决方法是创造一个第0节点,这个节点的next指针指向翻转后的头指针。
这样当m=1的时候,pre也就是第0节点(也是m-1节点)的next指向[m,n]段链表的头节点,因为m=1,也就是指向了新的整个链表的头节点
当m>1的时候,dummynode.next指向整个列表的头结点后就没有再改变。
所以返回dummynode.next能够保证一定返回链表的头,返回head就不一定能够返回链表的头