zoukankan      html  css  js  c++  java
  • 哈希

    同字母异序词判断

    题目来源

    LeetCode 242. Valid Anagram

    精简解题

    方法一

    1. 字符串排序
    2. 比较

    方法二

    1. 使用map存储字符串中字母出现次数
    2. 比较

    方法三

    1. 一维数组,字母做为下标统计出现次数
    2. 比较
    func isAnagram(s string, t string) bool {
    	if len(s) != len(t) {
    		return false
    	}
    	table := [26]int{}
    	for i := 0; i < len(s); i++ {
    		table[s[i]-'a']++
    	}
    	for i := 0; i < len(t); i++ {
    		table[t[i]-'a']--
    		if table[t[i]-'a'] < 0 {
    			return false
    		}
    	}
    	return true
    }
    

    两数之和

    题目来源

    LeetCode 1. Two Sum

    精简解题

    方法一

    1. 两个for循环
    2. 查找

    方法二

    1. 排序
    2. 遍历
    3. 二分查找另一个数

    方法三

    1. 使用hash,遍历i,找k-i是否存在
    2. 存在,记录下标返回
    //小技巧,hash记录的key是k-i,value是i的下标
    func twoSum(nums []int, target int) []int {
        m := make(map[int]int)
        for i, n := range nums {
            _, prs := m[n]
            if prs {
                return []int{m[n], i}
            } else {
                m[target-n] = i
            }
        }
        return nil
    }
    

    三数之和

    题目来源

    LeetCode 15. 3Sum

    精简解题

    方法一

    1. 三个for循环
    2. 查找

    方法二

    1. 遍历a
    2. 使用2Sum查找集合查找另两个数

    方法三

    1. 排序
    2. 遍历a
    3. 左右指针遍历寻找三数
    func threeSum(nums []int) [][]int {
    		var ret [][]int
    		sort.Ints(nums)
    		for i:=0;i<len(nums)-2;i++{
    				if i>0 && nums[i]==nums[i-1] {
    						continue
    				}
    				target, left, right := -nums[i], i+1, len(nums)-1
    				for left<right {
    						sum := nums[left] + nums[right]
    						if sum == target {
    								ret = append(ret, []int{nums[i],nums[left],nums[right]})
    								left++
    								right--
    								for left<right && nums[left] == nums[left-1] {
    										left++
    								}
    								for left<right && nums[right] == nums[right+1] {
    										right--
    								}
    						} else if sum > target {
    								right--
    						} else if sum < target {
    								left++
    						}
    				}
    		}
    		return ret
    }
    
    func threeSum2(nums []int) [][]int {
    	var ret [][]int
    	sort.Ints(nums)
    	for i := 0; i < len(nums)-2; i++ {
    		if i > 0 && nums[i] == nums[i-1] {
    			continue
    		}
    		m := make(map[int]bool, len(nums))
    		for j := i + 1; j < len(nums); j++ {
    			if _, ok := m[nums[j]]; ok {
    				ret = append(ret, []int{nums[i], -nums[i] - nums[j], nums[j]})
    			} else {
    				m[-nums[i]-nums[j]] = false
    			}
    		}
    	}
    	return ret
    }
    
  • 相关阅读:
    鸽巢原理 学习笔记
    POJ 1811 Prime Test
    Ubuntu下pdf乱码问题解决方法
    POJ 基础数学
    SRM遇到的一个数论技巧——最大公约数和最小公倍数的关系
    计算几何初步模板
    矩阵快速幂 学习笔记
    ZOJ 2849 Attack of Panda Virus (优先队列 priority_queue)
    欧几里德算法和扩展欧几里德算法
    记部分HASH函数
  • 原文地址:https://www.cnblogs.com/weiweng/p/12485945.html
Copyright © 2011-2022 走看看