代碼隨想錄:數(shù)組
數(shù)組是存儲在連續(xù)內(nèi)存空間上的相同類型數(shù)據(jù)集合,地址必須連續(xù),下標(biāo)從0開始
因為地址連續(xù)所以想要刪除某一元素就要移動后續(xù)所有元素的地址所以數(shù)組中的元素不能刪除只能覆蓋
實(shí)際使用注意最大下標(biāo)為.Length屬性的止-1
力扣704:二分查找
public?class?Solution?{
????public?int?Search(int[]?nums,?int?target)?{
????????int?left=0,?right=nums.Length-1;
//左右邊界
????????while?(left<=right? )? ? //閉區(qū)間
{? ??
????????????int?middle=left+(right-left)/2;
????????????if?(nums[middle]>target){
????????????????right=middle-1;、
//根據(jù)查找數(shù)據(jù)值大小決定下次的邊界下標(biāo)
????????????}
????????????else?if(nums[middle]<target){
????????????????left=middle+1;
????????????}
????????????else{
????????????????return?middle;
//找到目標(biāo)返回middle即為下標(biāo)
????????????}
????????}
????????return?-1;
//找不到返回-1
????}
}
有序且無重復(fù)元素的查找,此時使用二分查找
力扣27:移除元素
//雙指針,常用于數(shù)組與鏈表
public?class?Solution?{
????public?int?RemoveElement(int[]?nums,?int?val)?{
????????int?left=0;
????????for(int?right=0;right<nums.Length;right++){
????????????if(nums[right]!=val){
????????????????nums[left]=nums[right];
???????????????left+=1;、
//在每次循環(huán)中判斷快指針指向的元素值是否為要刪除的值,不是則把值賦給慢指針指的元素,是則快指針繼續(xù)移動
????????????}
????????}
????????return?left;
????}
}
最開始做本題時選擇對每次快指針指向目標(biāo)值時快慢指針?biāo)冈亟粨Q,多出了許多判斷操作,在時間復(fù)雜度相同的情況下判斷操作較多對程序用時差距影響很大,再一次循環(huán)中完成且判斷操作少才能優(yōu)化時間
本題中直接對原數(shù)組進(jìn)行操作,空間復(fù)雜度O(1)。
返回值是int,實(shí)際操作為
// nums 是以“引用”方式傳遞的。也就是說,不對實(shí)參作任何拷貝
int len = removeElement(nums, val);
// 在函數(shù)里修改輸入數(shù)組對于調(diào)用者是可見的。
// 根據(jù)你的函數(shù)返回的長度, 它會打印出數(shù)組中 該長度范圍內(nèi) 的所有元素。
for (int i = 0; i < len; i++) {
? ? print(nums[i]);
}
來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/remove-element
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
力扣209:長度最小的子數(shù)組
public?class?Solution?{
????public?int?MinSubArrayLen(int?target,?int[]?nums)?{
????????int?left=0,right=0,count=100001;
????????long?add=nums[right];
//滑動窗口
????????while(right<nums.Length){
????????????if(add<target){
????????????????right++;
????????????????if(right!=nums.Length){
????????????????????add+=nums[right];
//窗口右邊界移動
????????????????}
???????????????
????????????}
????????????else{
????????????????count=Math.Min(count,right-left+1);
????????????????add-=nums[left];
????????????????left++;
//窗口左邊界移動
????????????}
????????????
????????}
????????if(count==100001){
????????????count=0;
//目標(biāo)數(shù)據(jù)最大為10^5因此設(shè)定count初始值為10^5+1,若最后未找到結(jié)果則按題目要求返回0
????????}
????????return?count;
????}
}
滑動窗口可視為雙指針的一種,通過不斷調(diào)整子數(shù)組大小降低時間復(fù)雜度
力扣59:螺旋矩陣II
public?class?Solution?{
????public?int[][]?GenerateMatrix(int?n)?{
????????int[][]?cells=new?int[n][];
????????for(int?a=0;a<n;a++){
????????????cells[a]=new?int[n];
//初始化一個交錯數(shù)組,滿足題目中的返回值類型
????????}
????????int?x=0,y=0;//起始位置
????????int?i=0,j=0;
????????int?offset=1;//每條邊遍歷長度用
????????int?count=1;//填入的數(shù)字
????????int?loop=n/2;//進(jìn)行循環(huán)多少圈
????????int?mid=n/2;//矩陣中心坐標(biāo)
????????while(loop-->0){
????????????i=x;
????????????j=y;
????????????for(j=y;j<y+n-offset;j++){? ?//y+n-offset,y起始位置,n一條邊的元素數(shù)量,offset扣除的本次遍歷這一行不填入數(shù)字的格子數(shù)
????????????????cells[i][j]=count++;//填數(shù)
????????????}
????????????for(i=x;i<x+n-offset;i++){
????????????????cells[i][j]=count++;
????????????}
????????????for(;j>y;j--){
????????????????cells[i][j]=count++;
????????????}
????????????for(;i>x;i--){
????????????????cells[i][j]=count++;
????????????}
????????????offset+=2;//轉(zhuǎn)了一圈,下次循環(huán)就要少填兩個格子
????????????x++;
????????????y++;//下次循環(huán)開始在下一圈,起點(diǎn)從[0,0]變成[1,1]
????????}
????????if(n%2!=0){
????????????cells[mid][mid]=count;//若為奇數(shù)階的矩陣要手動填入最中心的元素
????????}
????????
????????
????????return?cells;
????}
}
暴力循環(huán),注意循環(huán)過程中堅持循環(huán)不變量,即每次循環(huán)的一條邊都是相同區(qū)間,這里選擇左閉右開