โซลูชัน 65 ไบต์ก่อนหน้า:
r->{for(int a,b=0,z,i=0;;b=a)if((a=b|1<<(z=r[i++]))==b)return z;}
โซลูชั่นใหม่ มีขนาด 19 ไบต์สำหรับimport java.math.*;
-8 ไบต์ขอบคุณ @Nevay
r->{int z,i=0;for(BigInteger c=BigInteger.ZERO;c.min(c=c.setBit(z=r[i++]))!=c;);return z;}
ลองออนไลน์!
แก้ไข
อัลกอริทึมในโปรแกรมดั้งเดิมของฉันใช้งานได้ดี แต่ขนาดคงที่ของประเภทข้อมูลที่ใช้หมายความว่ามันจะหักได้อย่างรวดเร็วพอสมควรเมื่อขนาดมีขนาดเกินเกณฑ์ที่กำหนด
ฉันได้เปลี่ยนประเภทข้อมูลที่ใช้ในการคำนวณเพื่อเพิ่มขีด จำกัด หน่วยความจำของโปรแกรมเพื่อรองรับสิ่งนี้ (ใช้BigInteger
สำหรับความแม่นยำโดยพลการแทนint
หรือlong
) อย่างไรก็ตามสิ่งนี้ทำให้เป็นที่ถกเถียงกันว่าสิ่งนี้นับเป็นO(1)
ความซับซ้อนของพื้นที่หรือไม่
ฉันจะปล่อยให้คำอธิบายของฉันด้านล่างไม่เป็นอันตราย แต่ฉันต้องการเพิ่มว่าตอนนี้ฉันเชื่อว่ามันเป็นไปไม่ได้ที่จะบรรลุO(1)
ความซับซ้อนของพื้นที่โดยไม่ต้องตั้งสมมติฐาน
พิสูจน์
กำหนดเป็นจำนวนเต็มเช่นว่าN
2 <= N
อนุญาตS
เป็นรายการที่เป็นตัวแทนของชุดของจำนวนเต็มสุ่มหนึ่ง[x{1}, ..., x{N}]
ที่มีข้อ จำกัดx{i}
1 <= x{i} <= N
ความซับซ้อนของเวลา (ในรูปแบบ Big-O) จำเป็นต้องทำซ้ำผ่านรายการนี้หนึ่งครั้งต่อองค์ประกอบเท่านั้น O(n)
ความท้าทายที่ได้รับคือการค้นหาค่าที่ซ้ำกันครั้งแรกในรายการ โดยเฉพาะอย่างยิ่งเรากำลังค้นหาค่าแรกในS
ที่ซ้ำกันของรายการก่อนหน้าในรายการ
อนุญาตp
และq
เป็นตำแหน่งของสององค์ประกอบในรายการเช่นนั้นp < q
และx{p} == x{q}
. ความท้าทายของเราคือการค้นหาสิ่งที่เล็กที่สุดq
ที่ตรงตามเงื่อนไขเหล่านั้น
แนวทางที่ชัดเจนในการแก้ไขปัญหานี้คือการย้ำผ่าน S และตรวจสอบว่าของเราx{i}
มีอยู่ในรายชื่ออื่นT
: ถ้าx{i}
ไม่อยู่ในที่เราเก็บไว้ในT
T
หากx{i}
มีอยู่T
มันจะเป็นค่าที่ซ้ำกันอันดับแรกดังนั้นจึงมีค่าน้อยที่สุดq
และเราจะคืนค่าดังกล่าว O(n)
ประสิทธิภาพการใช้พื้นที่นี้เป็น
เพื่อให้บรรลุO(1)
ความซับซ้อนของพื้นที่ในขณะที่รักษาO(n)
ความซับซ้อนของเวลาเราต้องเก็บข้อมูลที่ไม่ซ้ำกันเกี่ยวกับวัตถุแต่ละรายการในรายการในพื้นที่ จำกัด ด้วยเหตุนี้วิธีเดียวที่อัลกอริทึมใด ๆ สามารถทำได้ที่O(1)
ความซับซ้อนของพื้นที่คือถ้า: 1. N ได้รับขอบเขตบนที่สอดคล้องกับหน่วยความจำที่จำเป็นในการเก็บจำนวนสูงสุดของค่าที่เป็นไปได้สำหรับประเภทข้อมูล จำกัด เฉพาะ 2. การกำหนดตัวแปรที่ไม่เปลี่ยนรูปแบบใหม่จะไม่ถูกนับรวมกับความซับซ้อนเพียงจำนวนของตัวแปร (รายการที่มีหลายตัวแปร) 3. (ขึ้นอยู่กับคำตอบอื่น ๆ ) รายการคือ (หรืออย่างน้อยองค์ประกอบของรายการคือ) ไม่แน่นอนและประเภทข้อมูลของรายการจะถูกกำหนดไว้ล่วงหน้าเป็นจำนวนเต็มที่ลงนามเพื่อให้สามารถทำการเปลี่ยนแปลงองค์ประกอบเพิ่มเติมในรายการได้ โดยไม่ต้องใช้หน่วยความจำเพิ่มเติม
1 และ 3 ทั้งสองต้องการสมมติฐานและข้อมูลจำเพาะเกี่ยวกับประเภทข้อมูลในขณะที่ 2 กำหนดว่าจะต้องพิจารณาเฉพาะจำนวนของตัวแปรสำหรับการคำนวณความซับซ้อนของพื้นที่มากกว่าขนาดของตัวแปรเหล่านั้น หากไม่มีการยอมรับสมมติฐานเหล่านี้มันเป็นไปไม่ได้ที่จะบรรลุทั้งO(n)
ความซับซ้อนของเวลาและO(1)
ความซับซ้อนของพื้นที่
คำอธิบาย
เด็กผู้ชายคนนี้ใช้เวลานานในการคิดพลังสมอง
ดังนั้นการไปรับโบนัสจึงเป็นเรื่องยาก เราต้องการทั้งสองอย่างเพื่อดำเนินการในรายการทั้งหมดเพียงครั้งเดียวและติดตามค่าที่เราทำซ้ำไปแล้วโดยไม่มีความซับซ้อนของพื้นที่เพิ่มเติม
การจัดการบิตแก้ปัญหาเหล่านั้น เรากำหนดค่าเริ่มต้นO(1)
'พื้นที่เก็บข้อมูล' ของเราเป็นจำนวนเต็มคู่จากนั้นวนซ้ำตามรายการหรือเติมบิต ith ในจำนวนเต็มแรกของเราและเก็บผลลัพธ์นั้นเป็นวินาที
ตัวอย่างเช่นถ้าเรามี1101
และเราดำเนินการหรือการดำเนินการกับเราได้รับ10
1111
ถ้าเราทำอีกหรือเรายังมี10
1101
ดังนั้นเมื่อเราดำเนินการ OR และสิ้นสุดด้วยหมายเลขเดียวกันเราพบสำเนาของเราแล้ว ไม่มีการทำซ้ำในอาเรย์ทำให้โปรแกรมรันและโยนข้อยกเว้น