两个数组的交集 题目描述 给定两个数组,编写一个函数来计算它们的交集。
示例1:
输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2] 示例2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出: [9,4] 说明:
输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。 解题思路 遍历其中一个数组,找到在另外一个数组有相同值的数,添加到新建的切片中。 去除重复值。 这里可以运用map来转换,把数组一当键值;用数组二去查找,有相应键值,则标记;最后统计map中有标记的键值存入新建的切片中返回。 代码 func intersection(nums1 []int, nums2 []int) []int { r := []int{} m := make(map[int]int,len(nums1)) for _,v := range nums1 { m[v] = 0 } for _,v := range nums2 { if _,ok := m[v];ok { m[v] = 1 } } for i := range m { if m[i] !
颜色分类 题目描述 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意: 不能使用代码库中的排序函数来解决这道题。
示例:
输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2]
解题思路 因为数据只有0、1、2,且数据量较少,直接上简单选择排序:每经过一次外层循环,找到最小的数字,进行交换
代码 func sortColors(nums []int) { for i:=0;i<len(nums);i++ { min:=i for j:=i+1;j<len(nums);j++ { if nums[min] > nums[j] { min = j } } if min != i { nums[i],nums[min] = nums[min],nums[i] } } } 对链表进行插入排序 题目描述 示例 1: 输入: 4->2->1->3 输出: 1->2->3->4
示例 2: 输入: -1->5->3->4->0 输出: -1->0->3->4->5
解题思想 插入排序在这不在赘述,主要是代码编写
代码 /** * Definition for singly-linked list.
简单排序算法 公用部分 #define MAXSIZE 10typedef struct { int r[MAXSIZE+1];//r[0]用作哨兵或临时变量 int length; }SqList; void swap(SqList *L,int i,int j) { int temp = L->r[i]; L->r[i] = L->r[j]; L->r[j] = temp; } 堆排序 堆是具有下列性质的完全二叉树:
每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆。 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。 将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根结点。将他移走,然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次大值。如此反复执行,便能得到一个有序序列。
void HaepSort(SqList *L) { int i; //构造大顶堆 for(i=L->length/2;i>0;i--)/*序列从0到L->length/2,都是有孩子的结点*/ { HeapAdjust(L,i,L->length); } //将堆顶元素和最后一个元素交换,得到有序序列 for(i=L->length;i>1;i++) { swap(L,1,i); HeapAdjust(L,1,i-1); } } void HeapAdjust(SqList *L,int s,int m) { int temp,j; temp = L->r[s]; for(j=2*s;j<=m;j*=2)//找到左右子结点 { if(j < m && L->r[j] < L->r[j+1])//找到相对较大的孩子结点 ++j; if(temp >= L->r[j]) break; //交换值 L->r[s] = L->r[j]; s = j; //若j*=2后小于等于m,则继续向下层执行 } //交换值 L->r[s] = temp; } 归并排序 假设初始序列有含有n个记录,则可以看成是n个有序序列的子序列,每个子序列的长度为1,然后两辆归并,得到[n/2]个长度为2或1的有序子序列;再两两归并….