網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
問(wèn)題描述
原題鏈接:https://leetcode.cn/problems/remove-element/
解題方案
思路一
思路一:
首先通過(guò)簡(jiǎn)單分析,很明顯這是一道順序表相關(guān)問(wèn)題。首先能夠想到的是暴力求解,即思路一:找到所有的val,每次挪動(dòng)val后的數(shù)據(jù)覆蓋刪除val。
??代碼展示:
int find(int*nums,int numsSize,int val) { int i=0; for(i=0;i<numsSize;i++) { if(nums[i]==val) return i; } return -1; } int removeElement(int* nums, int numsSize, int val) { int ret; while((ret=find(nums,numsSize,val))!=-1) { for(int i=ret;i<numsSize-1;i++) { nums[i]=nums[i+1]; } numsSize--; } return numsSize; }
但是對(duì)于思路一,空間復(fù)雜度顯然是O(1),當(dāng)我們計(jì)算時(shí)間復(fù)雜度的時(shí)候,最壞的情況是數(shù)組中大部分值都為val,這時(shí)時(shí)間復(fù)雜度近似為O(1+2+……+n-1)即O(n^2),顯然O(n^2)的時(shí)間復(fù)雜度還是不盡人意,本著降低時(shí)間復(fù)雜度,我們可以怎樣優(yōu)化呢?
思路二
思路二:
在創(chuàng)建一個(gè)臨時(shí)數(shù)組tmp,遍歷nums數(shù)組,把不是val的數(shù)值放到tmp數(shù)組,最后把tmp數(shù)組的內(nèi)容依次拷貝到nums數(shù)組,返回tmp數(shù)組長(zhǎng)度。
??代碼展示:
int removeElement(int* nums, int numsSize, int val) { if(numsSize==0)//特殊處理 return 0; int i=0; int tmp[numsSize]; int count=0; for(i=0;i<numsSize;i++) { if(nums[i]!=val) { tmp[count]=nums[i]; count++; } } for(i=0;i<numsSize;i++) { nums[i]=tmp[i]; } return count; }
注釋?zhuān)哼@里的特殊處理是因?yàn)樵诤瘮?shù)中使用了變長(zhǎng)數(shù)組 int tmp[numsSize];而變長(zhǎng)數(shù)組的大小不能為0,這是使用特殊處理,是因?yàn)榱鄣臏y(cè)試用例中含有[] 0
。
對(duì)于思路二,最壞的情況我們只遍歷了1遍數(shù)組,即時(shí)間復(fù)雜度為O(n),但是這明顯是一種用空間換區(qū)時(shí)間的方法,在此過(guò)程我們創(chuàng)建了numsSize個(gè)變量,即空間復(fù)雜度為O(n)。所以我們能不能通過(guò)再降低空間復(fù)雜度,進(jìn)一步優(yōu)化呢?
思路三(最優(yōu)解)
思路三:
創(chuàng)建兩個(gè)變量src、dest,初始時(shí)指向首部,判斷nums[src]是否等于val,如果等于val則dest指向不動(dòng),src向后偏移,直到nums[src]!=val,令nums[dest]=nums[src],然后src、dest都向后偏移,直到src遍歷完數(shù)組,程序結(jié)束。
??代碼展示:
int removeElement(int* nums, int numsSize, int val) { int src=0; int dest=0; while(src<numsSize) { if(nums[src]!=val) { nums[dest]=nums[src]; src++; dest++; } else src++; } return dest; }
這種思路下時(shí)間復(fù)雜度為遍歷整個(gè)數(shù)組O(n),創(chuàng)建的變量為有限個(gè),所以空間復(fù)雜度為O(1)。相比之下為最優(yōu)解。
原文鏈接:https://blog.csdn.net/LEE180501/article/details/127231483
相關(guān)推薦
- 2022-05-18 ASP.NET?MVC過(guò)濾器執(zhí)行順序介紹_實(shí)用技巧
- 2023-05-29 Postgresql數(shù)據(jù)庫(kù)角色創(chuàng)建登錄詳解_PostgreSQL
- 2022-07-13 Docker的安裝部署與優(yōu)化
- 2022-09-08 python筆記之使用fillna()填充缺失值_python
- 2022-05-22 C#多線程的相關(guān)操作講解_C#教程
- 2022-11-22 python正則表達(dá)式中匹配次數(shù)與貪心問(wèn)題詳解(+??*)_python
- 2022-09-13 C++中的偽隨機(jī)數(shù)_C 語(yǔ)言
- 2024-04-04 springboot整合mongodb批量修改和添加索引,與設(shè)置mongodb保存更新超時(shí)時(shí)間
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支