• leetcode 关于重复问题和数组问题


    数组重复元素之类问题的整理

    lt26 删除排序数组重复项

    主要是原地删除,O(1) 空间,很是巧妙

    func removeDuplicates(nums []int) int {
    	//O(1)空间复杂
    	if len(nums)==0{
    		return 0
    	}
    	tmp:=0
    	//不同,tmp+1,放在相应位置
    	for i:=1;i<len(nums);i++{
    		if nums[tmp]!=nums[i]{
    			tmp++
    			nums[tmp]=nums[i]
    		}
    	}
    	return tmp+1 //返回tmp+1 因为系统测评是最大下标在tmp
    }
    
    
    lt80 删除排序数组II

    最多重复两次,空间O(1)
    pos是已经放置的位置,放之前和2位前比较,确认不重复

    func removeDuplicates(nums []int) int {
    	if len(nums)<3{
    		return len(nums)
    	}
    	pos:=2
    	//从2开始,
    	for i:=2;i<len(nums);i++{
    		if nums[i]!=nums[pos-2]{
    			nums[pos] = nums[i]
    			pos++
    		}
    	}
    	return pos
    }
    
    
    lt83 删除排序链表重复元素I

    和排序数组类似,重复数字只保留一个

    func deleteDuplicates(head *ListNode) *ListNode {
    	if head==nil||head.Next==nil{
    		return head
    	}
    	cur:=head
    	next:=head.Next
    
    	for next!=nil{
    		if cur.Val!=next.Val{
    			cur.Next = next
    			cur = cur.Next
    		}
    		next = next.Next
    	}
    	cur.Next = nil
    	return head
    }
    
    lt82 删除链表重复元素II

    删除所有的重复元素

    • 初始想法
      重复元素放入map,然后再遍历时候删除
    func deleteDuplicates(head *ListNode) *ListNode {
    	if head==nil||head.Next ==nil{
    		return head
    	}
    	//重复元素放置map中
    	hash:=make(map[int]int)
    	count:=0
    	pre:=head
    	cur:=head.Next
    	for cur!=nil{
    		if pre.Val==cur.Val{
    			count++
    		}else{
    			count=0
    		}
    		if count==1{
    			hash[cur.Val] = 1
    		}
    		pre = cur
    		cur = cur.Next
    	}
    	//找到对应的数删除
    	dummy:=new(ListNode)
    	dummy.Next = head
    	pre = dummy
    	cur = pre.Next
    	for cur!=nil{
    		if _,ok:=hash[cur.Val];ok{
    			pre.Next = cur.Next
    			cur = cur.Next
    			continue
    		}
    		pre = cur
    		cur = cur.Next
    	}
    	return dummy.Next
    }
    
    
    • 优化
      一次遍历,加入flag判断是否有重复
    func deleteDuplicates(head *ListNode) *ListNode {
    	if head==nil||head.Next ==nil{
    		return head
    	}
    	dummy:=new(ListNode)
    	dummy.Next = head
    	pre:=dummy
    	cur:=head
    	//一次性跳过所有重复元素
    	for cur!=nil{
    		flag:=false//标记有没有重复元素
    		for cur.Next!=nil&&cur.Val==cur.Next.Val{
    			cur = cur.Next
    			flag = true
    		}
    		if flag{ //有重复,cur.Next为不重复
    			pre.Next = cur.Next
    		}else{ //无重复,pre指向下一个
    			pre = cur
    		}
    		cur = cur.Next
    	}
    	return dummy.Next
    }
    
    lt217 存在重复元素I

    判断是否存在重复元素
    map一边判断一边加

    func containsDuplicate(nums []int) bool {
    	//map即可
    	hash:=make(map[int]int)
    	for i:=0;i<len(nums);i++{
    		if _,ok:=hash[nums[i]];ok{
    			return true
    		}
    		hash[nums[i]]=1
    	}
    	return false
    }
    

    数组

    4两个排序数组找中位数(要求时间复杂度O(m+n))

    二分法

    func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
         size:=len(nums1)+len(nums2)
         if size&1==1{
             return float64(getK(nums1,nums2,size/2+1))
         }else{
             index1,index2:=size/2-1,size/2 //找到中间前面一点
             //return float64((getK(nums1,nums2,index1+1)+getK(nums1,nums2,index2+1))/2.0)   //如果先求和/2后再转换float,值不对
             return float64(getK(nums1,nums2,index1+1)+getK(nums1,nums2,index2+1))/2.0    //加一符合函数中的找到下一个索引位置
         }
    }
    
    func getK(nums1 []int,nums2 []int,k int)int{
         index1,index2:=0,0
         for {
            if len(nums1)==index1{
                return nums2[index2+k-1]
            }
            
            if len(nums2)==index2{
                return nums1[index1+k-1]
            }
             
            if k==1{
                return min(nums1[index1],nums2[index2])
            }
            
            half:=k/2
            newindex1:=min(index1+half,len(nums1))-1 //找中点左边位置一个数
            newindex2:=min(index2+half,len(nums2))-1
            if nums1[newindex1]<=nums2[newindex2]{
                  k = k-(newindex1-index1+1)  //防止越界减去太多
                  index1 = newindex1+1  //下一次的开始位置
            }else{
                k = k-(newindex2-index2+1)
                index2 = newindex2+1
            }
             
         }
         return 0
    }
    
    func min(x,y int)int{
        if x>y{
            return y
        }else{
            return x
        }
    }
    
    数组中连续和为最大
    数组所有组合和为n
    数组连续数组乘积最大
  • 相关阅读:
    数据结构冒泡排序过程
    错误备忘_VS_VS 2008 下不能调试程序
    我的程序员之路——谋一时?谋一世?
    Ext.Net 1.2.0/Ext JS_用 Ext JS 遍历查找过滤检索 Ext.Net.Store 检索
    Ext.Net 1.2.0_演示 Ext.Net+Barcode 封装条形码控件
    以 Ext.Net 1.2.0 为例了解网页测试工具 HttpWatch
    Ext.Net 1.2.0_演示为权限控制动态创建按钮的一个解决方案02_2
    Ext.Net 1.2.0_Ext.Net.Combox AutoComplete 功能
    Oracle 11g Release 1 (11.1) Data Pump 技术
    Oracle 11g R1(11.1)连接子句(join_clause)
  • 原文地址:https://www.cnblogs.com/9527s/p/14377157.html
Copyright © 2020-2023  润新知