1、给两个字符串s和t,判断t是否为s的重新排列后组成的单词。

  • s = "anagram", t = "nagaram", return true.
  • s = "rat", t = "car", return false.
  • leetcode地址:https://leetcode.com/problems/valid-anagram/description/

(1)解法一:排序,O(n*logn)

class Solution:
def isAnagram(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
ss = list(s)
tt = list(t)
ss.sort()
tt.sort()
return ss == tt
"""
输入:"anagram"、"nagaram"
输出:true
Runtime: 32 ms
"""

  排序方法简写如下:

class Solution:
def isAnagram(self, s, t):
return sorted(list(s)) == sorted(list(t))

(2)解法二:判断字母数量一致,时间复杂度O(n)

class Solution:
def isAnagram(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
dict1 = {} # 用字典来维护字符的数量
dict2 = {}
for ch in s:
dict1[ch] = dict1.get(ch, 0) + 1 # 没有就新建,有就加1
for ch in t:
dict2[ch] = dict2.get(ch, 0) + 1
return dict1 == dict2 """
输入:"anagram","nagaram"
输出:true
Runtime: 32 ms
"""

2、给定一个m*n的二维列表,查找一个数是否存在。

  列表有下列特性:

  • 每一行的列表从左到右已经排序好。
  • 每一行第一个数比上一行最后一个数大。
  • leetcode地址:https://leetcode.com/problems/search-a-2d-matrix/description/

  

(1)解法一:线性查找查找,O(mn)

class Solution:
def searchMatrix(self, matrix, target):
"""
:type matrix: List[List[int]]
:type target: int
:rtype: bool
"""
for line in matrix:
if target in line:
return True
return False

(2)解法二:二分查找O(logn)

class Solution:
def searchMatrix(self, matrix, target):
"""
:type matrix: List[List[int]]
:type target: int
:rtype: bool
"""
h = len(matrix) # 高
if h == 0:
return False w = len(matrix[0]) # 列
if w == 0:
return False left = 0
right = w * h - 1 while left <= right:
mid = ((left + right)) // 2
i = mid // w
j = mid % w
if matrix[i][j] == target:
return True
elif matrix[i][j] > target:
right = mid - 1
else:
left = mid + 1
else:
return False

3、给定一个列表和一个整数,设计算法找到两个数的下标,使得两个数之和为给定的整数。

  保证肯定仅有一个结果。

  leetcode地址:https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/description/

  例如,列表[1,2,5,4]与目标整数3,1+2=3,结果为(0,1).

(1)方法一:通过二分查找,找到需要的数字。时间复杂度:O(nlogn)

  首先确定第一个数,再通过给定整数确定要查找的数,通过二分查找到需要的数。

class Solution:
def binary_search(self, li, left, right,val):
"""
二分查找
:param li: 输入的列表
:param val: 输入的待查找的值
:return:
"""
while left <= right: # 说明候选区有值
mid = (left + right) // 2 # 因为是下标, 因此要整除2
if li[mid] == val:
# 找到待查找的值返回index
return mid
elif li[mid] > val:
# 待查找的值在mid左侧
right = mid - 1 # 更新候选区
else: # li[mid] < val
# 待查找的值在mid右侧
left = mid + 1 # 更新候选区
else:
# 没有找到
return None def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i in range(len(nums)):
a = nums[i]
b = target - a
if b >= a:
j = self.binary_search(nums, i+1, len(nums)-1, b)
else:
j = self.binary_search(nums, 0, i-1, b)
if j:
break
return sorted([i+1,j+1])

(2)方法二:针对已经排好序的列表

  leetcode地址:https://leetcode.com/problems/two-sum/description/

class Solution:
def binary_search(self, li, left, right,val):
"""
二分查找
:param li: 输入的列表
:param val: 输入的待查找的值
:return:
"""
while left <= right: # 说明候选区有值
mid = (left + right) // 2 # 因为是下标, 因此要整除2
if li[mid][0] == val:
# 找到待查找的值返回index
return mid
elif li[mid][0] > val:
# 待查找的值在mid左侧
right = mid - 1 # 更新候选区
else: # li[mid] < val
# 待查找的值在mid右侧
left = mid + 1 # 更新候选区
else:
# 没有找到
return None def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
new_nums = [[num, i] for i,num in enumerate(nums)]
new_nums.sort(key=lambda x:x[0]) for i in range(len(new_nums)):
a = new_nums[i][0] # 数
b = target - a
if b >= a:
j = self.binary_search(new_nums, i+1, len(new_nums)-1, b)
else:
j = self.binary_search(new_nums, 0, i-1, b)
if j:
break
return sorted([new_nums[i][1], new_nums[j][1]])

算法——查找排序相关面试题和leetcode使用的更多相关文章

  1. 20162311 编写Android程序测试查找排序算法

    20162311 编写Android程序测试查找排序算法 一.设置图形界面 因为是测试查找和排序算法,所以先要有一个目标数组.为了得到一个目标数组,我设置一个EditText和一个Button来添加数 ...

  2. 常见的排序算法(直接插入&选择排序&二分查找排序)

    1.直接插入排序算法 源码: package com.DiYiZhang;/* 插入排序算法 * 如下进行的是插入,排序算法*/ public class InsertionSort {    pub ...

  3. Java冒泡,快速,插入,选择排序^_^+二分算法查找

    这段时间在学Java,期间学到了一些排序和查找方法.特此写来和大家交流,也方便自己的日后查看与复习. 1.下边是Java的主类: public class Get { public static vo ...

  4. 算法<初级> - 第一章 排序相关问题

    算法 - 第一章 时间复杂度: Big O 时间/空间复杂度计算一样,都是跟输入数据源的大小有关 n->∞ O(logn) 每次只使用数据源的一半,logn同理 最优解 先满足时间复杂度的情况最 ...

  5. HashMap源码与相关面试题

    一.哈希表 哈希表是一种可以快速定位得数据结构.哈希表可以做到平均查找.插入.删除时间是O(1),当然这是指不发生Hash碰撞得情况.而哈希表最大得缺陷就是哈希值得碰撞(collision). Has ...

  6. javascript数据结构与算法--高级排序算法

    javascript数据结构与算法--高级排序算法 高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法-- ...

  7. 2 算法查找&排序问题

    一.查找 1.查找的概念: 2 顺序查找(linear search) 从头找到尾 def linear_search(li,val): for ind ,v in enumerate(li): if ...

  8. javascript数据结构与算法--基本排序算法(冒泡、选择、排序)及效率比较

    javascript数据结构与算法--基本排序算法(冒泡.选择.排序)及效率比较 一.数组测试平台. javascript数据结构与算法--基本排序(封装基本数组的操作),封装常规数组操作的函数,比如 ...

  9. Linux相关面试题&答案

    Linux相关面试题&答案 Linux面试题&答案 假设apache日志格式为:118.78.199.98 – - [09/Jan/2010:00:59:59 +0800] " ...

随机推荐

  1. 5.EM

  2. qt线程睡眠

    头文件 #include <QThread> 接口函数: void QThread::sleep ( unsigned long secs )   [static protected] v ...

  3. chrome 相关设置.

    1. 使用chrome 添加道桌面的快捷方式,自动打开两个 tab 解决方法: chrome://apps/ 右击 你的应用图标..勾选在新窗口打开.

  4. PHP 中 快捷的三元运算...

    a!=null ? a: 123 当 a 不为空时,返回 123, 可简写为 a ?: 123(a 不为null 不为 '','0',0 时,返回它本身,否则返回123...)

  5. 【记录】adb连不上手机

    1.\用户\.android文件夹下新建adb_usb.ini,内容为手机的VID值,如0x9BB5 2.重启adb adb kill-server adb start-server adb devi ...

  6. Heap — 20181120

    363. Trapping Rain Water public class Solution { /** * @param heights: a list of integers * @return: ...

  7. python小商店

    (1) 输入自己所有的钱.(2) 展示商品的序号,名称及其价格.(3) 输入要买商品的序号.(4) 输入要买商品的数量.(5) 购物车中显示购买的水果名称及其对应的数量和剩余钱.(6) 如果序号输入有 ...

  8. PIE SDK矢量数据的读取

    1.功能简介 GIS将地理空间数据表示为矢量数据和栅格数据.矢量数据模型使用点.线和多边形来表示具有清晰空间位置和边界的空间要素,如控制点.河流和宗地等,每个要素被赋予一个ID,以便与其属性相关联.栅 ...

  9. PIE SDK矢量数据的查询

    1.功能简介 矢量数据查询有属性查询和空间几何查询,下面对矢量数据的属性查询和空间查询做介绍 2.功能实现说明 2.1. 矢量数据的属性和空间查询 2.2. 实现思路及原理说明 第一步 得到要查询的图 ...

  10. PIE SDK常用滤波

    1. 算法功能简介 空间域滤波实在图像空间( x. y)对输入图像应用滤波函数(核.模板)来改进输出图像的处理方法,主要包括平滑和锐化处理,强调像素与其周围相邻像素的关系,常用的方法是卷积运算. 空间 ...