很多时候看到题目,如果你认真的思考,大都会得到一个直观的思路,跟着这个思路做会得到一个结果。但这只是第一步,很多时候first thought的结果并非最优的,甚至会有很多冗余。这个时候我们不能满足于仅仅跑通代码,得到一个预期的输出就ok了。否则我们很难得到有效的进步。我认为我们要再次审题,再次审视自己的代码,看看哪些地方的计算有冗余,可以优化,看看哪些概念可以转换,很多时候你换个角度理解,就会发现不同的角度竟然可以更高效的解决相同的问题。
每道题目都会有多种解法,希望自己在练习时都能深入去思考,思考问题的本质在哪里。当然前提是打好基本功。
好了,唠完开始上题。以下很多题目来自leetcode
常用的数据结构 包括 数组、字符串、链表、队列、栈、树。下面会逐一回顾和举例。
一、数组
用于按顺序存储元素的集合。元素可以随机存取,因为数组中元素可通过索引访问。存取的时间复杂度为O(1)
数组可以是一维,也可以是多维的。 一维数组也称为线性数组。
以下代码简单说明数组的基本用法
1、数组定义,初始化
int[] a0 = new int[5];
int[] a1 = {1,2,3};
以上为两种初始化方法。
2、数组访问
for(int i=0;i<a0.length;i++)
System.out.println( a1[i] )
以上数组的定义都是固定容量,即初始化时指定了数组大小。这种形式有时很不方便。
因此大多数语言都提供了内置的动态数组,它仍是随机存取的列表数据结构,但大小是可变的。
如c++ 中的vector java中的ArrayList C#中的List<> 以及python中的列表list
以下是一些数组相关的代码编程题,皆来自leetcode
题一
给定一个整数类型的数组 nums
,请编写一个能够返回数组“中心索引”的方法。
我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。
如果数组不存在中心索引,那么我们应该返回 -1。如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个。
例如:
输入:
nums = [1, 7, 3, 6, 5, 6]
输出: 3 解释 :索引3 (nums[3] = 6) 的左侧数之和(1 + 7 + 3 = 11),与右侧数之和(5 + 6 = 11)相等。
同时, 3 也是第一个符合要求的中心索引。
为了练习python,以下全部用python语言编写
方法一 暴力破解, 遍历所有情况 ,时间复杂度O(n*n)
def pivotIndex(nums):
if nums == None:
return -1
for i in range(len(nums)):
left,right =0,0
for j in range(i):
left += int(nums[j])
for k in range(i+1,len(nums)):
right += int(nums[k])
if left == right:
return i
return -1
#方法一可以解决问题,但显然效率太低,计算有冗余,我们要想办法减少计算冗余,提升算法效率