Week 22 0814--0820

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就不一定能够返回链表的头

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容